{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "4ddcd7bb-dccc-497e-9fad-635f3d2d4675",
   "metadata": {},
   "source": [
    "# numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)\n",
    "\n",
    "- object\t数组或嵌套的数列\n",
    "- dtype\t数组元素的数据类型，可选\n",
    "- copy\t对象是否需要复制，可选\n",
    "- order\t创建数组的样式，C为行方向，F为列方向，A为任意方向（默认）\n",
    "- subok\t默认返回一个与基类类型一致的数组\n",
    "- ndmin\t指定生成数组的最小维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7ff30b83-2421-42b0-8b2d-ed6d118a1319",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "a = np.array([1,2,3])  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7368ad43-6e6a-49ee-a746-74adfc2fd386",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,  2],  [3,  4]])  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e6bb46fa-a919-49b7-9cbc-593bd3834425",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2 3 4 5]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1, 2, 3, 4, 5], ndmin =  2)  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "62ab9cd6-524f-4969-9f36-e4e820858b53",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.+0.j 2.+0.j 3.+0.j]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,  2,  3], dtype = complex)  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "874da44f-facf-4f4b-b338-5e5fe53821e1",
   "metadata": {},
   "source": [
    "# NumPy 数据类型\n",
    "\n",
    "|名称|描述|\n",
    "|--|--|\n",
    "|bool_|布尔型数据类型（True 或者 False）|\n",
    "|int_|默认的整数类型（类似于 C 语言中的 long，int32 或 int64）|\n",
    "|intc|与 C 的 int 类型一样，一般是 int32 或 int 64|\n",
    "|intp|用于索引的整数类型（类似于 C 的 ssize_t，一般情况下仍然是 int32 或 int64）|\n",
    "|int8|字节（-128 to 127）|\n",
    "|int16|整数（-32768 to 32767）|\n",
    "|int32|整数（-2147483648 to 2147483647）|\n",
    "|int64|整数（-9223372036854775808 to 9223372036854775807）|\n",
    "|uint8|无符号整数（0 to 255）|\n",
    "|uint16|无符号整数（0 to 65535）|\n",
    "|uint32|无符号整数（0 to 4294967295）|\n",
    "|uint64|无符号整数（0 to 18446744073709551615）|\n",
    "|float_|float64 类型的简写|\n",
    "|float16|半精度浮点数，包括：1 个符号位，5 个指数位，10 个尾数位|\n",
    "|float32|单精度浮点数，包括：1 个符号位，8 个指数位，23 个尾数位|\n",
    "|float64|双精度浮点数，包括：1 个符号位，11 个指数位，52 个尾数位|\n",
    "|complex_|complex128 类型的简写，即 128 位复数|\n",
    "|complex64|复数，表示双 32 位浮点数（实数部分和虚数部分）|\n",
    "|complex128|复数，表示双 64 位浮点数（实数部分和虚数部分）|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c8a38174-08f1-4ccc-b4a5-85eb67cd08e5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "int32\n"
     ]
    }
   ],
   "source": [
    "# 使用标量类型\n",
    "dt = np.dtype(np.int32)\n",
    "print(dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "65da47be-d9c0-4d6b-b89a-be590b545c87",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "int32\n"
     ]
    }
   ],
   "source": [
    "# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替\n",
    "dt = np.dtype('i4')\n",
    "print(dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6e4a9897-4ce4-49e9-95cf-fcb1677051e2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "int32\n"
     ]
    }
   ],
   "source": [
    "# 字节顺序标注\n",
    "dt = np.dtype('<i4')\n",
    "print(dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6931d803-4ce8-42d3-8b8e-6cae1c0af28c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('age', 'i1')]\n"
     ]
    }
   ],
   "source": [
    "# 首先创建结构化数据类型\n",
    "dt = np.dtype([('age',np.int8)]) \n",
    "print(dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "132a1cfa-9b7d-45a3-b765-be2d88da317c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(10,) (20,) (30,)]\n"
     ]
    }
   ],
   "source": [
    "# 将数据类型应用于 ndarray 对象\n",
    "dt = np.dtype([('age',np.int8)]) \n",
    "a = np.array([(10,),(20,),(30,)], dtype = dt) \n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "41adb942-954b-46a5-8809-4c64caaa865f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[10 20 30]\n"
     ]
    }
   ],
   "source": [
    "# 类型字段名可以用于存取实际的 age 列\n",
    "dt = np.dtype([('age',np.int8)]) \n",
    "a = np.array([(10,),(20,),(30,)], dtype = dt) \n",
    "print(a['age'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b5919bfa-eeb1-437a-b2b3-41c5cde0432f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]\n"
     ]
    }
   ],
   "source": [
    "student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) \n",
    "print(student)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "ea13e403-b8aa-4967-8f2c-db437f81a4b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(b'abc', 21, 50.) (b'xyz', 18, 75.)]\n"
     ]
    }
   ],
   "source": [
    "student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) \n",
    "a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) \n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "91af20bd-adc3-413c-b74e-22149b985454",
   "metadata": {},
   "source": [
    "|字符|对应类型|\n",
    "|--|--|\n",
    "|b|布尔型|\n",
    "|i|(有符号) 整型|\n",
    "|u|无符号整型 integer|\n",
    "|f|浮点型|\n",
    "|c|复数浮点型|\n",
    "|m|timedelta（时间间隔）|\n",
    "|M|datetime（日期时间）|\n",
    "|O|(Python) 对象|\n",
    "|S, a|(byte-)字符串|\n",
    "|U|Unicode|\n",
    "|V|原始数据 (void)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47ddfe44-9431-43e4-a098-03397580800a",
   "metadata": {},
   "source": [
    "# 数组属性\n",
    "\n",
    "|属性|说明|\n",
    "|--|--|\n",
    "|ndarray.ndim|数组的秩（rank），即数组的维度数量或轴的数量。|\n",
    "|ndarray.shape|数组的维度，表示数组在每个轴上的大小。对于二维数组（矩阵），表示其行数和列数。|\n",
    "|ndarray.size|数组中元素的总个数，等于 ndarray.shape 中各个轴上大小的乘积。|\n",
    "|ndarray.dtype|数组中元素的数据类型。|\n",
    "|ndarray.itemsize|数组中每个元素的大小，以字节为单位。|\n",
    "|ndarray.flags|包含有关内存布局的信息，如是否为 C 或 Fortran 连续存储，是否为只读等。|\n",
    "|ndarray.real|数组中每个元素的实部（如果元素类型为复数）。|\n",
    "|ndarray.imag|数组中每个元素的虚部（如果元素类型为复数）。|\n",
    "|ndarray.data|实际存储数组元素的缓冲区，一般通过索引访问元素，不直接使用该属性。|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c425da8e-0a7d-44e2-b4d6-962ca6db34c7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "3\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(24)  \n",
    "print (a.ndim)             # a 现只有一个维度\n",
    "# 现在调整其大小\n",
    "b = a.reshape(2,4,3)  # b 现在拥有三个维度\n",
    "print (b.ndim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "d0c16b97-a1e4-434c-afbc-6a081cf6643d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2, 3)\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[4,5,6]])  \n",
    "print (a.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a0c08c05-b089-46b0-a03c-cf1048070b9e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[4,5,6]]) \n",
    "a.shape =  (3,2)  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b8c23929-2178-4323-9e85-b11399a33f17",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[4,5,6]]) \n",
    "b = a.reshape(3,2)  \n",
    "print (b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "ebc3958f-c4dc-43a9-8e9a-ea2c47a516fe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "8\n"
     ]
    }
   ],
   "source": [
    "# 数组的 dtype 为 int8（一个字节）  \n",
    "x = np.array([1,2,3,4,5], dtype = np.int8)  \n",
    "print (x.itemsize)\n",
    " \n",
    "# 数组的 dtype 现在为 float64（八个字节） \n",
    "y = np.array([1,2,3,4,5], dtype = np.float64)  \n",
    "print (y.itemsize)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca254072-89cb-4e74-8732-f6c7e7235ab6",
   "metadata": {},
   "source": [
    "# ndarray.flags\n",
    "\n",
    "ndarray.flags 返回 ndarray 对象的内存信息，包含以下属性：\n",
    "\n",
    "|属性|描述|\n",
    "|--|--|\n",
    "|C_CONTIGUOUS (C)|数据是在一个单一的C风格的连续段中|\n",
    "|F_CONTIGUOUS (F)|数据是在一个单一的Fortran风格的连续段中|\n",
    "|OWNDATA (O)|数组拥有它所使用的内存或从另一个对象中借用它|\n",
    "|WRITEABLE (W)|数据区域可以被写入，将该值设置为 False，则数据为只读|\n",
    "|ALIGNED (A)|数据和所有元素都适当地对齐到硬件上|\n",
    "|UPDATEIFCOPY (U)|这个数组是其它数组的一个副本，当这个数组被释放时，原数组的内容将被更新"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5d504158-8257-4ad6-b659-3f36e6160d0d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  C_CONTIGUOUS : True\n",
      "  F_CONTIGUOUS : True\n",
      "  OWNDATA : True\n",
      "  WRITEABLE : True\n",
      "  ALIGNED : True\n",
      "  WRITEBACKIFCOPY : False\n",
      "\n"
     ]
    }
   ],
   "source": [
    "x = np.array([1,2,3,4,5])  \n",
    "print (x.flags)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22612e70-0980-4c7f-9832-cae2c939e37e",
   "metadata": {},
   "source": [
    "# numpy.empty(shape, dtype = float, order = 'C')\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|shape|数组形状|\n",
    "|dtype|数据类型，可选|\n",
    "|order|有\"C\"和\"F\"两个选项,分别代表，行优先和列优先，在计算机内存中的存储元素的顺序。|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "ddbf68d3-267b-4e35-b11b-354855472d0b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n"
     ]
    }
   ],
   "source": [
    "x = np.empty([3,2], dtype = int) \n",
    "print (x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8cfbc9dd-5483-4209-99ff-324b804f93c4",
   "metadata": {},
   "source": [
    "# numpy.zeros(shape, dtype = float, order = 'C')\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|shape|数组形状|\n",
    "|dtype|数据类型，可选|\n",
    "|order|'C' 用于 C 的行数组，或者 'F' 用于 FORTRAN 的列数组|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "d69517ab-1f5e-4aba-86aa-f619a240b2b7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0. 0. 0. 0. 0.]\n",
      "[0 0 0 0 0]\n",
      "[[(0, 0) (0, 0)]\n",
      " [(0, 0) (0, 0)]]\n"
     ]
    }
   ],
   "source": [
    "# 默认为浮点数\n",
    "x = np.zeros(5) \n",
    "print(x)\n",
    "\n",
    "# 设置类型为整数\n",
    "y = np.zeros((5,), dtype = int) \n",
    "print(y)\n",
    "\n",
    "# 自定义类型\n",
    "z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  \n",
    "print(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19dc44bb-d3d0-45bc-aee6-885e670adf6a",
   "metadata": {},
   "source": [
    "# numpy.ones(shape, dtype = None, order = 'C')\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|shape|数组形状|\n",
    "|dtype|数据类型，可选|\n",
    "|order|'C' 用于 C 的行数组，或者 'F' 用于 FORTRAN 的列数组|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "ccce82ef-4646-4867-9d29-469c443eb5e2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1. 1. 1. 1. 1.]\n",
      "[[1 1]\n",
      " [1 1]]\n"
     ]
    }
   ],
   "source": [
    "# 默认为浮点数\n",
    "x = np.ones(5) \n",
    "print(x)\n",
    "\n",
    "# 自定义类型\n",
    "x = np.ones([2,2], dtype = int)\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4351387-0a24-44ec-9aec-d28cab44ce3a",
   "metadata": {},
   "source": [
    "# numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)|\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|a|给定要创建相同形状的数组|\n",
    "|dtype|创建的数组的数据类型|\n",
    "|order|数组在内存中的存储顺序，可选值为 'C'（按行优先）或 'F'（按列优先），默认为 'K'（保留输入数组的存储顺序）|\n",
    "|subok|是否允许返回子类，如果为 True，则返回一个子类对象，否则返回一个与 a 数组具有相同数据类型和存储顺序的数组|\n",
    "|shape|创建的数组的形状，如果不指定，则默认为 a 数组的形状。|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "fe0a65fd-1468-4d51-8b4c-347745193028",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 0 0]\n",
      " [0 0 0]\n",
      " [0 0 0]]\n"
     ]
    }
   ],
   "source": [
    "# 创建一个 3x3 的二维数组\n",
    "arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n",
    "\n",
    "# 创建一个与 arr 形状相同的，所有元素都为 0 的数组\n",
    "zeros_arr = np.zeros_like(arr)\n",
    "print(zeros_arr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abe454e8-8e61-4810-906b-d2a9ecc1669e",
   "metadata": {},
   "source": [
    "# numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None)\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|a|给定要创建相同形状的数组|\n",
    "|dtype|创建的数组的数据类型|\n",
    "|order|数组在内存中的存储顺序，可选值为 'C'（按行优先）或 'F'（按列优先），默认为 'K'（保留输入数组的存储顺序）|\n",
    "|subok|是否允许返回子类，如果为 True，则返回一个子类对象，否则返回一个与 a 数组具有相同数据类型和存储顺序的数组|\n",
    "|shape|创建的数组的形状，如果不指定，则默认为 a 数组的形状。|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "1c03e565-ae5d-4b7c-bce0-7a91cc5e04a5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 1 1]\n",
      " [1 1 1]\n",
      " [1 1 1]]\n"
     ]
    }
   ],
   "source": [
    "# 创建一个 3x3 的二维数组\n",
    "arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n",
    "\n",
    "# 创建一个与 arr 形状相同的，所有元素都为 1 的数组\n",
    "ones_arr = np.ones_like(arr)\n",
    "print(ones_arr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60a5b9d4-4ee0-46e2-b920-223eded2db1e",
   "metadata": {},
   "source": [
    "# numpy.asarray(a, dtype = None, order = None)|\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|a|任意形式的输入参数，可以是，列表, 列表的元组, 元组, 元组的元组, 元组的列表，多维数组|\n",
    "|dtype|数据类型，可选|\n",
    "|order|可选，有\"C\"和\"F\"两个选项,分别代表，行优先和列优先，在计算机内存中的存储元素的顺序。|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "20eec48e-22e5-4ba1-a7f8-db42cd3513ed",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3]\n"
     ]
    }
   ],
   "source": [
    "x =  [1,2,3] \n",
    "a = np.asarray(x)  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "07940028-d80e-43ee-bb92-db72e2c2d511",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3]\n"
     ]
    }
   ],
   "source": [
    "x =  (1,2,3) \n",
    "a = np.asarray(x)  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "55bd423e-fccd-4614-9267-eb1e63fc1077",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1. 2. 3.]\n"
     ]
    }
   ],
   "source": [
    "x =  [1,2,3] \n",
    "a = np.asarray(x, dtype =  float)  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f27a40ce-27e4-416e-a990-8c399e861359",
   "metadata": {},
   "source": [
    "# numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)|\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|buffer|可以是任意对象，会以流的形式读入。|\n",
    "|dtype|返回数组的数据类型，可选|\n",
    "|count|读取的数据数量，默认为-1，读取所有数据。|\n",
    "|offset|读取的起始位置，默认为0。|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a8f8e387-a199-400a-8740-8b34eb60549f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']\n"
     ]
    }
   ],
   "source": [
    "s =  b'Hello World' \n",
    "a = np.frombuffer(s, dtype =  'S1')  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "884cfa0e-4c2b-4614-94c8-b22bd32dd7e8",
   "metadata": {},
   "source": [
    "# numpy.fromiter(iterable, dtype, count=-1)|\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|iterable|可迭代对象|\n",
    "|dtype|返回数组的数据类型|\n",
    "|count|读取的数据数量，默认为-1，读取所有数据|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "9ec12386-90fe-4025-b6af-b67d404a07a2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0. 1. 2. 3. 4.]\n"
     ]
    }
   ],
   "source": [
    "# 使用 range 函数创建列表对象  \n",
    "list=range(5)\n",
    "it=iter(list)\n",
    " \n",
    "# 使用迭代器创建 ndarray \n",
    "x=np.fromiter(it, dtype=float)\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4bb7302a-1e62-4247-b163-88cab73d30c4",
   "metadata": {},
   "source": [
    "# numpy.arange(start, stop, step, dtype)|\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|start|起始值，默认为0|\n",
    "|stop|终止值（不包含）|\n",
    "|step|步长，默认为1|\n",
    "|dtype|返回ndarray的数据类型，如果没有提供，则会使用输入数据的类型。|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "e86d35f1-2f48-4aef-a9e4-ea695ecb5718",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4]\n"
     ]
    }
   ],
   "source": [
    "x = np.arange(5)  \n",
    "print (x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "f8c4d56b-2001-4305-9879-5ac5f56ba222",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0. 1. 2. 3. 4.]\n"
     ]
    }
   ],
   "source": [
    "# 设置了 dtype\n",
    "x = np.arange(5, dtype =  float)  \n",
    "print (x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "c6e2e64f-9725-4bf1-a635-9f8e3a2005cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[10 12 14 16 18]\n"
     ]
    }
   ],
   "source": [
    "x = np.arange(10,20,2)  \n",
    "print (x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2036d265-bc68-4c23-bb96-4cbc3873a62c",
   "metadata": {},
   "source": [
    "# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)|\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|start|序列的起始值|\n",
    "|stop|序列的终止值，如果endpoint为true，该值包含于数列中|\n",
    "|num|要生成的等步长的样本数量，默认为50|\n",
    "|endpoint|该值为 true 时，数列中包含stop值，反之不包含，默认是True。|\n",
    "|retstep|如果为 True 时，生成的数组中会显示间距，反之不显示。|\n",
    "|dtype|ndarray 的数据类型|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "5d0d7f31-d293-4a1c-be79-3d3d53474330",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]\n"
     ]
    }
   ],
   "source": [
    "a = np.linspace(1,10,10)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "7b18b781-c108-41f8-9277-57dea72d7fc3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n"
     ]
    }
   ],
   "source": [
    "a = np.linspace(1,1,10)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "c7876b65-55dd-400b-bd96-6112c06b8f3d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[10. 12. 14. 16. 18.]\n"
     ]
    }
   ],
   "source": [
    "a = np.linspace(10, 20,  5, endpoint =  False)  \n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "4b1fc32f-6146-4604-9fac-e01afa385850",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]), np.float64(1.0))\n",
      "[[ 1.]\n",
      " [ 2.]\n",
      " [ 3.]\n",
      " [ 4.]\n",
      " [ 5.]\n",
      " [ 6.]\n",
      " [ 7.]\n",
      " [ 8.]\n",
      " [ 9.]\n",
      " [10.]]\n"
     ]
    }
   ],
   "source": [
    "a =np.linspace(1,10,10,retstep= True)\n",
    " \n",
    "print(a)\n",
    "# 拓展例子\n",
    "b =np.linspace(1,10,10).reshape([10,1])\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae5a4f2f-cfda-45f3-b661-3cd7b3282cae",
   "metadata": {},
   "source": [
    "# np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)|\n",
    "\n",
    "|参数|描述|\n",
    "|--|--|\n",
    "|start|序列的起始值为：base ** start|\n",
    "|stop|序列的终止值为：base ** stop。如果endpoint为true，该值包含于数列中|\n",
    "|num|要生成的等步长的样本数量，默认为50|\n",
    "|endpoint|该值为 true 时，数列中中包含stop值，反之不包含，默认是True。|\n",
    "|base|对数 log 的底数。|\n",
    "|dtype|ndarray 的数据类型|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "9e58a623-5969-4c4b-a8e4-357101c04d08",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 10.          12.91549665  16.68100537  21.5443469   27.82559402\n",
      "  35.93813664  46.41588834  59.94842503  77.42636827 100.        ]\n"
     ]
    }
   ],
   "source": [
    "# 默认底数是 10\n",
    "a = np.logspace(1.0,  2.0, num =  10)  \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "25b97ebd-f2cb-4099-8302-e2a8e494c1ea",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]\n"
     ]
    }
   ],
   "source": [
    "a = np.logspace(0,9,10,base=2)\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "ccbccc6e-7004-4d83-b79a-b91916571264",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 4 6]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(10)\n",
    "s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止，间隔为2\n",
    "print (a[s])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "33957c90-31cb-4dce-90ce-bce567f0e8e4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 4 6]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(10)  \n",
    "b = a[2:7:2]   # 从索引 2 开始到索引 7 停止，间隔为 2\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "15bff1c4-801f-4be9-9e67-482faf73aabe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]\n",
    "b = a[5] \n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "e122e720-b185-4e9c-9f81-249da965d1c1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 3 4 5 6 7 8 9]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(10)\n",
    "print(a[2:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "60a8edc0-2521-4dbe-b166-e40d9fff536f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 3 4]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]\n",
    "print(a[2:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "5d1150ed-d8ef-4d54-bcdd-fff41fac89aa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2 3]\n",
      " [3 4 5]\n",
      " [4 5 6]]\n",
      "从数组索引 a[1:] 处开始切割\n",
      "[[3 4 5]\n",
      " [4 5 6]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[3,4,5],[4,5,6]])\n",
    "print(a)\n",
    "# 从某个索引处开始切割\n",
    "print('从数组索引 a[1:] 处开始切割')\n",
    "print(a[1:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "82b94db4-7026-4461-9630-770789008747",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 4 5]\n",
      "[3 4 5]\n",
      "[[2 3]\n",
      " [4 5]\n",
      " [5 6]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[3,4,5],[4,5,6]])  \n",
    "print (a[...,1])   # 第2列元素\n",
    "print (a[1,...])   # 第2行元素\n",
    "print (a[...,1:])  # 第2列及剩下的所有元素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "d5c00ce8-b1cc-4265-bf0b-d15cf665da5b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 4 5]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([[1,  2],  [3,  4],  [5,  6]]) \n",
    "y = x[[0,1,2],  [0,1,0]]  \n",
    "print (y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "6f745034-3a85-4252-920f-6a472cec299d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[ 0  1  2]\n",
      " [ 3  4  5]\n",
      " [ 6  7  8]\n",
      " [ 9 10 11]]\n",
      "\n",
      "\n",
      "这个数组的四个角元素是：\n",
      "[[ 0  2]\n",
      " [ 9 11]]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  \n",
    "print ('我们的数组是：' )\n",
    "print (x)\n",
    "print ('\\n')\n",
    "rows = np.array([[0,0],[3,3]]) \n",
    "cols = np.array([[0,2],[0,2]]) \n",
    "y = x[rows,cols]  \n",
    "print  ('这个数组的四个角元素是：')\n",
    "print (y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "4afc252d-a2e0-4d3a-af75-221b74cbc537",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[5 6]\n",
      " [8 9]]\n",
      "[[5 6]\n",
      " [8 9]]\n",
      "[[2 3]\n",
      " [5 6]\n",
      " [8 9]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3], [4,5,6],[7,8,9]])\n",
    "b = a[1:3, 1:3]\n",
    "c = a[1:3,[1,2]]\n",
    "d = a[...,1:]\n",
    "print(b)\n",
    "print(c)\n",
    "print(d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "5ab02a93-b23c-44b8-9a32-78748185fecd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[ 0  1  2]\n",
      " [ 3  4  5]\n",
      " [ 6  7  8]\n",
      " [ 9 10 11]]\n",
      "\n",
      "\n",
      "大于 5 的元素是：\n",
      "[ 6  7  8  9 10 11]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  \n",
    "print ('我们的数组是：')\n",
    "print (x)\n",
    "print ('\\n')\n",
    "# 现在我们会打印出大于 5 的元素  \n",
    "print  ('大于 5 的元素是：')\n",
    "print (x[x >  5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "3e8b7ed0-b392-4490-b3e5-d726dd2f98ce",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1. 2. 3. 4. 5.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([np.nan,  1,2,np.nan,3,4,5])  \n",
    "print (a[~np.isnan(a)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "723ddc44-35e0-4063-bf21-b3aa2c9b17ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2. +6.j 3.5+5.j]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,  2+6j,  5,  3.5+5j])  \n",
    "print (a[np.iscomplex(a)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "0905cfa4-fd39-432a-a76c-116455ad4078",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4 5 6 7 8]\n",
      "-------读取下标对应的元素-------\n",
      "[0 6]\n",
      "0\n",
      "6\n"
     ]
    }
   ],
   "source": [
    "x = np.arange(9)\n",
    "print(x)\n",
    "# 一维数组读取指定下标对应的元素\n",
    "print(\"-------读取下标对应的元素-------\")\n",
    "x2 = x[[0, 6]] # 使用花式索引\n",
    "print(x2)\n",
    "\n",
    "print(x2[0])\n",
    "print(x2[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "3c26594f-dc58-4781-a6fc-ff88d67288db",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]\n",
      " [12 13 14 15]\n",
      " [16 17 18 19]\n",
      " [20 21 22 23]\n",
      " [24 25 26 27]\n",
      " [28 29 30 31]]\n",
      "-------读取下标对应的行-------\n",
      "[[16 17 18 19]\n",
      " [ 8  9 10 11]\n",
      " [ 4  5  6  7]\n",
      " [28 29 30 31]]\n"
     ]
    }
   ],
   "source": [
    "x=np.arange(32).reshape((8,4))\n",
    "print(x)\n",
    "# 二维数组读取指定下标对应的行\n",
    "print(\"-------读取下标对应的行-------\")\n",
    "print (x[[4,2,1,7]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "10941742-9172-433c-8865-10c9d0874d34",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[16 17 18 19]\n",
      " [24 25 26 27]\n",
      " [28 29 30 31]\n",
      " [ 4  5  6  7]]\n"
     ]
    }
   ],
   "source": [
    "x=np.arange(32).reshape((8,4))\n",
    "print (x[[-4,-2,-1,-7]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "dda57b49-78c5-48c8-af45-d5e817905e57",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 4  7  5  6]\n",
      " [20 23 21 22]\n",
      " [28 31 29 30]\n",
      " [ 8 11  9 10]]\n"
     ]
    }
   ],
   "source": [
    "x=np.arange(32).reshape((8,4))\n",
    "print (x[np.ix_([1,5,7,2],[0,3,1,2])])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "dd3da961-b9f5-4a4d-b274-f063de118d54",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 10  40  90 160]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,2,3,4]) \n",
    "b = np.array([10,20,30,40]) \n",
    "c = a * b \n",
    "print (c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "6799f99c-8b67-40a5-9815-5de965bf328a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2]\n",
      " [10 11 12]\n",
      " [20 21 22]\n",
      " [30 31 32]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[ 0, 0, 0],\n",
    "           [10,10,10],\n",
    "           [20,20,20],\n",
    "           [30,30,30]])\n",
    "b = np.array([0,1,2])\n",
    "print(a + b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "e12b3e90-8385-423d-bd20-b3bea4b951a9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1  2  3]\n",
      " [11 12 13]\n",
      " [21 22 23]\n",
      " [31 32 33]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[ 0, 0, 0],\n",
    "           [10,10,10],\n",
    "           [20,20,20],\n",
    "           [30,30,30]])\n",
    "b = np.array([1,2,3])\n",
    "bb = np.tile(b, (4, 1))  # 重复 b 的各个维度\n",
    "print(a + bb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "479a907c-a28b-4d24-bfd7-4e381f811043",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数组是：\n",
      "[[0 1 2]\n",
      " [3 4 5]]\n",
      "\n",
      "\n",
      "迭代输出元素：\n",
      "0, 1, 2, 3, 4, 5, \n",
      "\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(6).reshape(2,3)\n",
    "print ('原始数组是：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    "print ('迭代输出元素：')\n",
    "for x in np.nditer(a):\n",
    "    print (x, end=\", \" )\n",
    "print ('\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "0db0b568-c5f1-4f9a-a7aa-e1d0c432dc53",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0, 1, 2, 3, 4, 5, \n",
      "\n",
      "0, 3, 1, 4, 2, 5, \n",
      "\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(6).reshape(2,3)\n",
    "for x in np.nditer(a.T):\n",
    "    print (x, end=\", \" )\n",
    "print ('\\n')\n",
    " \n",
    "for x in np.nditer(a.T.copy(order='C')):\n",
    "    print (x, end=\", \" )\n",
    "print ('\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "a493a991-1a71-44e0-a776-b7952c753ee0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数组是：\n",
      "[[ 0  5 10 15]\n",
      " [20 25 30 35]\n",
      " [40 45 50 55]]\n",
      "\n",
      "\n",
      "原始数组的转置是：\n",
      "[[ 0 20 40]\n",
      " [ 5 25 45]\n",
      " [10 30 50]\n",
      " [15 35 55]]\n",
      "\n",
      "\n",
      "以 C 风格顺序排序：\n",
      "[[ 0 20 40]\n",
      " [ 5 25 45]\n",
      " [10 30 50]\n",
      " [15 35 55]]\n",
      "0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, \n",
      "\n",
      "以 F 风格顺序排序：\n",
      "[[ 0 20 40]\n",
      " [ 5 25 45]\n",
      " [10 30 50]\n",
      " [15 35 55]]\n",
      "0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, "
     ]
    }
   ],
   "source": [
    "a = np.arange(0,60,5) \n",
    "a = a.reshape(3,4)  \n",
    "print ('原始数组是：') \n",
    "print (a) \n",
    "print ('\\n') \n",
    "print ('原始数组的转置是：') \n",
    "b = a.T \n",
    "print (b) \n",
    "print ('\\n') \n",
    "print ('以 C 风格顺序排序：') \n",
    "c = b.copy(order='C')  \n",
    "print (c)\n",
    "for x in np.nditer(c):  \n",
    "    print (x, end=\", \" )\n",
    "print  ('\\n') \n",
    "print  ('以 F 风格顺序排序：')\n",
    "c = b.copy(order='F')  \n",
    "print (c)\n",
    "for x in np.nditer(c):  \n",
    "    print (x, end=\", \" )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "78368e9a-3f80-4173-b849-861fc6002b57",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数组是：\n",
      "[[ 0  5 10 15]\n",
      " [20 25 30 35]\n",
      " [40 45 50 55]]\n",
      "\n",
      "\n",
      "以 C 风格顺序排序：\n",
      "0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, \n",
      "\n",
      "以 F 风格顺序排序：\n",
      "0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, "
     ]
    }
   ],
   "source": [
    "a = np.arange(0,60,5) \n",
    "a = a.reshape(3,4)  \n",
    "print ('原始数组是：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    "print ('以 C 风格顺序排序：')\n",
    "for x in np.nditer(a, order =  'C'):  \n",
    "    print (x, end=\", \" )\n",
    "print ('\\n')\n",
    "print ('以 F 风格顺序排序：')\n",
    "for x in np.nditer(a, order =  'F'):  \n",
    "    print (x, end=\", \" )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "ee375941-db40-4bb8-b4e1-ec95df849754",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数组是：\n",
      "[[ 0  5 10 15]\n",
      " [20 25 30 35]\n",
      " [40 45 50 55]]\n",
      "\n",
      "\n",
      "修改后的数组是：\n",
      "[[  0  10  20  30]\n",
      " [ 40  50  60  70]\n",
      " [ 80  90 100 110]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(0,60,5) \n",
    "a = a.reshape(3,4)  \n",
    "print ('原始数组是：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    "for x in np.nditer(a, op_flags=['readwrite']): \n",
    "    x[...]=2*x \n",
    "print ('修改后的数组是：')\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "d8b69b0c-b45e-4828-8ad3-a64ba712242d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数组是：\n",
      "[[ 0  5 10 15]\n",
      " [20 25 30 35]\n",
      " [40 45 50 55]]\n",
      "\n",
      "\n",
      "修改后的数组是：\n",
      "[ 0 20 40], [ 5 25 45], [10 30 50], [15 35 55], "
     ]
    }
   ],
   "source": [
    "a = np.arange(0,60,5) \n",
    "a = a.reshape(3,4)  \n",
    "print ('原始数组是：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    "print ('修改后的数组是：')\n",
    "for x in np.nditer(a, flags =  ['external_loop'], order =  'F'):  \n",
    "   print (x, end=\", \" )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "2db4a6bb-42ec-4a32-a17e-7beba81da7a6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组为：\n",
      "[[ 0  5 10 15]\n",
      " [20 25 30 35]\n",
      " [40 45 50 55]]\n",
      "\n",
      "\n",
      "第二个数组为：\n",
      "[1 2 3 4]\n",
      "\n",
      "\n",
      "修改后的数组为：\n",
      "0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4, "
     ]
    }
   ],
   "source": [
    "a = np.arange(0,60,5) \n",
    "a = a.reshape(3,4)  \n",
    "print  ('第一个数组为：')\n",
    "print (a)\n",
    "print  ('\\n')\n",
    "print ('第二个数组为：')\n",
    "b = np.array([1,  2,  3,  4], dtype =  int)  \n",
    "print (b)\n",
    "print ('\\n')\n",
    "print ('修改后的数组为：')\n",
    "for x,y in np.nditer([a,b]):  \n",
    "    print (\"%d:%d\"  %  (x,y), end=\", \" )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbaefae2-d7d2-4f3c-8332-eaf59ff49c67",
   "metadata": {},
   "source": [
    "# numpy.reshape(arr, newshape, order='C')\n",
    "\n",
    "- arr：要修改形状的数组\n",
    "- newshape：整数或者整数数组，新的形状应当兼容原有形状\n",
    "- order：'C' -- 按行，'F' -- 按列，'A' -- 原顺序，'k' -- 元素在内存中的出现顺序。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "c26e05a4-13b8-4eb1-908c-298278304775",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数组：\n",
      "[0 1 2 3 4 5 6 7]\n",
      "\n",
      "\n",
      "修改后的数组：\n",
      "[[0 1]\n",
      " [2 3]\n",
      " [4 5]\n",
      " [6 7]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(8)\n",
    "print ('原始数组：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    " \n",
    "b = a.reshape(4,2)\n",
    "print ('修改后的数组：')\n",
    "print (b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "75e8853c-5898-4a51-b6b9-8eb6317d562c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数组：\n",
      "[0 1 2]\n",
      "[3 4 5]\n",
      "[6 7 8]\n",
      "迭代后的数组：\n",
      "0\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(9).reshape(3,3) \n",
    "print ('原始数组：')\n",
    "for row in a:\n",
    "    print (row)\n",
    " \n",
    "#对数组中每个元素都进行处理，可以使用flat属性，该属性是一个数组元素迭代器：\n",
    "print ('迭代后的数组：')\n",
    "for element in a.flat:\n",
    "    print (element)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "444ecff2-b23d-4ad6-99c6-9396076fb33b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[0 1 2 3]\n",
      " [4 5 6 7]]\n",
      "\n",
      "\n",
      "展开的数组：\n",
      "[0 1 2 3 4 5 6 7]\n",
      "\n",
      "\n",
      "以 F 风格顺序展开的数组：\n",
      "[0 4 1 5 2 6 3 7]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(8).reshape(2,4)\n",
    " \n",
    "print ('原数组：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    "# 默认按行\n",
    " \n",
    "print ('展开的数组：')\n",
    "print (a.flatten())\n",
    "print ('\\n')\n",
    " \n",
    "print ('以 F 风格顺序展开的数组：')\n",
    "print (a.flatten(order = 'F'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "1e9778a4-3d57-4ac0-8ea8-5893fa93772f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[0 1 2 3]\n",
      " [4 5 6 7]]\n",
      "\n",
      "\n",
      "调用 ravel 函数之后：\n",
      "[0 1 2 3 4 5 6 7]\n",
      "\n",
      "\n",
      "以 F 风格顺序调用 ravel 函数之后：\n",
      "[0 4 1 5 2 6 3 7]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(8).reshape(2,4)\n",
    " \n",
    "print ('原数组：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    " \n",
    "print ('调用 ravel 函数之后：')\n",
    "print (a.ravel())\n",
    "print ('\\n')\n",
    " \n",
    "print ('以 F 风格顺序调用 ravel 函数之后：')\n",
    "print (a.ravel(order = 'F'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "29054791-273c-469e-8661-e318553333be",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "\n",
      "\n",
      "对换数组：\n",
      "[[ 0  4  8]\n",
      " [ 1  5  9]\n",
      " [ 2  6 10]\n",
      " [ 3  7 11]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(12).reshape(3,4)\n",
    " \n",
    "print ('原数组：')\n",
    "print (a )\n",
    "print ('\\n')\n",
    " \n",
    "print ('对换数组：')\n",
    "print (np.transpose(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "3558ecd9-6a38-460b-aa1d-62244f0e39be",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "\n",
      "\n",
      "转置数组：\n",
      "[[ 0  4  8]\n",
      " [ 1  5  9]\n",
      " [ 2  6 10]\n",
      " [ 3  7 11]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(12).reshape(3,4)\n",
    " \n",
    "print ('原数组：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    " \n",
    "print ('转置数组：')\n",
    "print (a.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "71d664ad-d385-4238-844d-939aa37d6820",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[[0 1]\n",
      "  [2 3]]\n",
      "\n",
      " [[4 5]\n",
      "  [6 7]]]\n",
      "获取数组中一个值：\n",
      "(array([1]), array([1]), array([0]))\n",
      "6\n",
      "\n",
      "\n",
      "调用 rollaxis 函数：\n",
      "[[[0 2]\n",
      "  [4 6]]\n",
      "\n",
      " [[1 3]\n",
      "  [5 7]]]\n",
      "(array([0]), array([1]), array([1]))\n",
      "\n",
      "\n",
      "调用 rollaxis 函数：\n",
      "[[[0 2]\n",
      "  [1 3]]\n",
      "\n",
      " [[4 6]\n",
      "  [5 7]]]\n",
      "(array([1]), array([0]), array([1]))\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 创建了三维的 ndarray\n",
    "a = np.arange(8).reshape(2,2,2)\n",
    " \n",
    "print ('原数组：')\n",
    "print (a)\n",
    "print ('获取数组中一个值：')\n",
    "print(np.where(a==6))   \n",
    "print(a[1,1,0])  # 为 6\n",
    "print ('\\n')\n",
    "\n",
    "# 将轴 2 滚动到轴 0（宽度到深度）\n",
    "print ('调用 rollaxis 函数：')\n",
    "b = np.rollaxis(a,2,0)\n",
    "print (b)\n",
    "# 查看元素 a[1,1,0]，即 6 的坐标，变成 [0, 1, 1]\n",
    "# 最后一个 0 移动到最前面\n",
    "print(np.where(b==6))   \n",
    "print ('\\n')\n",
    " \n",
    "# 将轴 2 滚动到轴 1：（宽度到高度）\n",
    "print ('调用 rollaxis 函数：')\n",
    "c = np.rollaxis(a,2,1)\n",
    "print (c)\n",
    "# 查看元素 a[1,1,0]，即 6 的坐标，变成 [1, 0, 1]\n",
    "# 最后的 0 和 它前面的 1 对换位置\n",
    "print(np.where(c==6))   \n",
    "print ('\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "32d37923-7373-4989-9516-71193677f93e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[[0 1]\n",
      "  [2 3]]\n",
      "\n",
      " [[4 5]\n",
      "  [6 7]]]\n",
      "\n",
      "\n",
      "调用 swapaxes 函数后的数组：\n",
      "[[[0 4]\n",
      "  [2 6]]\n",
      "\n",
      " [[1 5]\n",
      "  [3 7]]]\n"
     ]
    }
   ],
   "source": [
    "# 创建了三维的 ndarray\n",
    "a = np.arange(8).reshape(2,2,2)\n",
    " \n",
    "print ('原数组：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    "# 现在交换轴 0（深度方向）到轴 2（宽度方向）\n",
    "print ('调用 swapaxes 函数后的数组：')\n",
    "print (np.swapaxes(a, 2, 0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "24ea4525-4683-4c12-bb5a-fa0a20d1d2ce",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "对 y 广播 x：\n",
      "1 4\n",
      "1 5\n",
      "\n",
      "\n",
      "广播对象的形状：\n",
      "(3, 3)\n",
      "\n",
      "\n",
      "手动使用 broadcast 将 x 与 y 相加：\n",
      "(3, 3)\n",
      "\n",
      "\n",
      "调用 flat 函数：\n",
      "[[5. 6. 7.]\n",
      " [6. 7. 8.]\n",
      " [7. 8. 9.]]\n",
      "\n",
      "\n",
      "x 与 y 的和：\n",
      "[[5 6 7]\n",
      " [6 7 8]\n",
      " [7 8 9]]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([[1], [2], [3]])\n",
    "y = np.array([4, 5, 6])  \n",
    "# 对 y 广播 x\n",
    "b = np.broadcast(x,y)  \n",
    "# 它拥有 iterator 属性，基于自身组件的迭代器元组\n",
    "print ('对 y 广播 x：')\n",
    "r,c = b.iters\n",
    "# Python3.x 为 next(context) ，Python2.x 为 context.next()\n",
    "print (next(r), next(c))\n",
    "print (next(r), next(c))\n",
    "print ('\\n')\n",
    "# shape 属性返回广播对象的形状\n",
    "print ('广播对象的形状：')\n",
    "print (b.shape)\n",
    "print ('\\n')\n",
    "# 手动使用 broadcast 将 x 与 y 相加\n",
    "b = np.broadcast(x,y)\n",
    "c = np.empty(b.shape)\n",
    "print ('手动使用 broadcast 将 x 与 y 相加：')\n",
    "print (c.shape)\n",
    "print ('\\n')\n",
    "c.flat = [u + v for (u,v) in b]\n",
    "print ('调用 flat 函数：')\n",
    "print (c)\n",
    "print ('\\n')\n",
    "# 获得了和 NumPy 内建的广播支持相同的结果\n",
    "print ('x 与 y 的和：')\n",
    "print (x + y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "b77b516a-c0eb-44e1-97dd-8697f6ef1087",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[0 1 2 3]]\n",
      "\n",
      "\n",
      "调用 broadcast_to 函数之后：\n",
      "[[0 1 2 3]\n",
      " [0 1 2 3]\n",
      " [0 1 2 3]\n",
      " [0 1 2 3]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(4).reshape(1,4)\n",
    " \n",
    "print ('原数组：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    " \n",
    "print ('调用 broadcast_to 函数之后：')\n",
    "print (np.broadcast_to(a,(4,4)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "d77d8ba6-b09e-4b46-a52d-d549778f3842",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数组 x：\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "数组 y：\n",
      "[[[1 2]\n",
      "  [3 4]]]\n",
      "数组 x 和 y 的形状：\n",
      "(2, 2) (1, 2, 2)\n",
      "在位置 1 插入轴之后的数组 y：\n",
      "[[[1 2]]\n",
      "\n",
      " [[3 4]]]\n",
      "x.ndim 和 y.ndim：\n",
      "2 3\n",
      "x.shape 和 y.shape：\n",
      "(2, 2) (2, 1, 2)\n"
     ]
    }
   ],
   "source": [
    "x = np.array(([1,2],[3,4]))\n",
    "print ('数组 x：')\n",
    "print (x)\n",
    "y = np.expand_dims(x, axis = 0)\n",
    "print ('数组 y：')\n",
    "print (y)\n",
    "print ('数组 x 和 y 的形状：')\n",
    "print (x.shape, y.shape)\n",
    "# 在位置 1 插入轴\n",
    "y = np.expand_dims(x, axis = 1)\n",
    "print ('在位置 1 插入轴之后的数组 y：')\n",
    "print (y)\n",
    "print ('x.ndim 和 y.ndim：')\n",
    "print (x.ndim,y.ndim)\n",
    "print ('x.shape 和 y.shape：')\n",
    "print (x.shape, y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "2e49389a-af4a-4aec-9729-f33166289fce",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数组 x：\n",
      "[[[0 1 2]\n",
      "  [3 4 5]\n",
      "  [6 7 8]]]\n",
      "数组 y：\n",
      "[[0 1 2]\n",
      " [3 4 5]\n",
      " [6 7 8]]\n",
      "数组 x 和 y 的形状：\n",
      "(1, 3, 3) (3, 3)\n"
     ]
    }
   ],
   "source": [
    "x = np.arange(9).reshape(1,3,3)\n",
    "print ('数组 x：')\n",
    "print (x)\n",
    "y = np.squeeze(x)\n",
    "print ('数组 y：')\n",
    "print (y)\n",
    "print ('数组 x 和 y 的形状：')\n",
    "print (x.shape, y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "f67a6d76-38ad-4346-a67d-e597fdc4ec12",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "第二个数组：\n",
      "[[5 6]\n",
      " [7 8]]\n",
      "沿轴 0 连接两个数组：\n",
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]\n",
      " [7 8]]\n",
      "沿轴 1 连接两个数组：\n",
      "[[1 2 5 6]\n",
      " [3 4 7 8]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4]])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "b = np.array([[5,6],[7,8]])\n",
    "print ('第二个数组：')\n",
    "print (b)\n",
    "# 两个数组的维度相同\n",
    "print ('沿轴 0 连接两个数组：')\n",
    "print (np.concatenate((a,b)))\n",
    "print ('沿轴 1 连接两个数组：')\n",
    "print (np.concatenate((a,b),axis = 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "33661b67-8211-4929-9929-75e61e8af945",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "第二个数组：\n",
      "[[5 6]\n",
      " [7 8]]\n",
      "沿轴 0 堆叠两个数组：\n",
      "[[[1 2]\n",
      "  [3 4]]\n",
      "\n",
      " [[5 6]\n",
      "  [7 8]]]\n",
      "沿轴 1 堆叠两个数组：\n",
      "[[[1 2]\n",
      "  [5 6]]\n",
      "\n",
      " [[3 4]\n",
      "  [7 8]]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4]])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "b = np.array([[5,6],[7,8]])\n",
    "print ('第二个数组：')\n",
    "print (b)\n",
    "print ('沿轴 0 堆叠两个数组：')\n",
    "print (np.stack((a,b),0))\n",
    "print ('沿轴 1 堆叠两个数组：')\n",
    "print (np.stack((a,b),1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "e1f6fb8f-cc1c-4616-b7e2-eb19a88c3624",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "第二个数组：\n",
      "[[5 6]\n",
      " [7 8]]\n",
      "水平堆叠：\n",
      "[[1 2 5 6]\n",
      " [3 4 7 8]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4]])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "b = np.array([[5,6],[7,8]])\n",
    "print ('第二个数组：')\n",
    "print (b)\n",
    "print ('水平堆叠：')\n",
    "c = np.hstack((a,b))\n",
    "print (c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "a0a32b2a-cd80-422b-ac22-f62049d4ce3c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "第二个数组：\n",
      "[[5 6]\n",
      " [7 8]]\n",
      "竖直堆叠：\n",
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]\n",
      " [7 8]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4]])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "b = np.array([[5,6],[7,8]])\n",
    "print ('第二个数组：')\n",
    "print (b)\n",
    "print ('竖直堆叠：')\n",
    "c = np.vstack((a,b))\n",
    "print (c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "485f8b5a-4623-411a-b76b-df7e147126d2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[0 1 2 3 4 5 6 7 8]\n",
      "将数组分为三个大小相等的子数组：\n",
      "[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]\n",
      "将数组在一维数组中表明的位置分割：\n",
      "[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(9)\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('将数组分为三个大小相等的子数组：')\n",
    "b = np.split(a,3)\n",
    "print (b)\n",
    "print ('将数组在一维数组中表明的位置分割：')\n",
    "b = np.split(a,[4,7])\n",
    "print (b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "4feaf945-5c86-4fc8-9e97-592f7d99127e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]\n",
      " [12 13 14 15]]\n",
      "默认分割（0轴）：\n",
      "[array([[0, 1, 2, 3],\n",
      "       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],\n",
      "       [12, 13, 14, 15]])]\n",
      "沿水平方向分割：\n",
      "[array([[ 0,  1],\n",
      "       [ 4,  5],\n",
      "       [ 8,  9],\n",
      "       [12, 13]]), array([[ 2,  3],\n",
      "       [ 6,  7],\n",
      "       [10, 11],\n",
      "       [14, 15]])]\n",
      "沿水平方向分割：\n",
      "[array([[ 0,  1],\n",
      "       [ 4,  5],\n",
      "       [ 8,  9],\n",
      "       [12, 13]]), array([[ 2,  3],\n",
      "       [ 6,  7],\n",
      "       [10, 11],\n",
      "       [14, 15]])]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(16).reshape(4, 4)\n",
    "print('第一个数组：')\n",
    "print(a)\n",
    "print('默认分割（0轴）：')\n",
    "b = np.split(a,2)\n",
    "print(b)\n",
    "print('沿水平方向分割：')\n",
    "c = np.split(a,2,1)\n",
    "print(c)\n",
    "print('沿水平方向分割：')\n",
    "d= np.hsplit(a,2)\n",
    "print(d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "d320156b-a578-4581-94f4-55a9b20f56b0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原array：\n",
      "[[9. 6. 5. 5. 2. 5.]\n",
      " [4. 6. 2. 8. 4. 4.]]\n",
      "拆分后：\n",
      "[array([[9., 6.],\n",
      "       [4., 6.]]), array([[5., 5.],\n",
      "       [2., 8.]]), array([[2., 5.],\n",
      "       [4., 4.]])]\n"
     ]
    }
   ],
   "source": [
    "harr = np.floor(10 * np.random.random((2, 6)))\n",
    "print ('原array：')\n",
    "print(harr)\n",
    "print ('拆分后：')\n",
    "print(np.hsplit(harr, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "d77c1a85-f0c8-4dc0-a402-6d1903e8d53b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]\n",
      " [12 13 14 15]]\n",
      "竖直分割：\n",
      "[array([[0, 1, 2, 3],\n",
      "       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],\n",
      "       [12, 13, 14, 15]])]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(16).reshape(4,4)\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('竖直分割：')\n",
    "b = np.vsplit(a,2)\n",
    "print (b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "5e5d14ac-5b26-4553-9ee2-aeb013cfd598",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "第一个数组的形状：\n",
      "(2, 3)\n",
      "第二个数组：\n",
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n",
      "第二个数组的形状：\n",
      "(3, 2)\n",
      "修改第二个数组的大小：\n",
      "[[1 2 3]\n",
      " [4 5 6]\n",
      " [1 2 3]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[4,5,6]])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('第一个数组的形状：')\n",
    "print (a.shape)\n",
    "b = np.resize(a, (3,2))\n",
    "print ('第二个数组：')\n",
    "print (b)\n",
    "print ('第二个数组的形状：')\n",
    "print (b.shape)\n",
    "# 要注意 a 的第一行在 b 中重复出现，因为尺寸变大了\n",
    "print ('修改第二个数组的大小：')\n",
    "b = np.resize(a,(3,3))\n",
    "print (b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "6e3e4666-5c48-4211-84a6-434dd268c01d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "向数组添加元素：\n",
      "[1 2 3 4 5 6 7 8 9]\n",
      "沿轴 0 添加元素：\n",
      "[[1 2 3]\n",
      " [4 5 6]\n",
      " [7 8 9]]\n",
      "沿轴 1 添加元素：\n",
      "[[1 2 3 5 5 5]\n",
      " [4 5 6 7 8 9]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[4,5,6]])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('向数组添加元素：')\n",
    "print (np.append(a, [7,8,9]))\n",
    "print ('沿轴 0 添加元素：')\n",
    "print (np.append(a, [[7,8,9]],axis = 0))\n",
    "print ('沿轴 1 添加元素：')\n",
    "print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "d4c56792-74ec-498c-8848-7b605a465375",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n",
      "未传递 Axis 参数。 在删除之前输入数组会被展开。\n",
      "[ 1  2  3 11 12  4  5  6]\n",
      "传递了 Axis 参数。 会广播值数组来配输入数组。\n",
      "沿轴 0 广播：\n",
      "[[ 1  2]\n",
      " [11 11]\n",
      " [ 3  4]\n",
      " [ 5  6]]\n",
      "沿轴 1 广播：\n",
      "[[ 1 11  2]\n",
      " [ 3 11  4]\n",
      " [ 5 11  6]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4],[5,6]])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('未传递 Axis 参数。 在删除之前输入数组会被展开。')\n",
    "print (np.insert(a,3,[11,12]))\n",
    "print ('传递了 Axis 参数。 会广播值数组来配输入数组。')\n",
    "print ('沿轴 0 广播：')\n",
    "print (np.insert(a,1,[11],axis = 0))\n",
    "print ('沿轴 1 广播：')\n",
    "print (np.insert(a,1,11,axis = 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "9a1ff210-7ab0-433b-a890-a15fbd70d5ae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "未传递 Axis 参数。 在插入之前输入数组会被展开。\n",
      "[ 0  1  2  3  4  6  7  8  9 10 11]\n",
      "删除第二列：\n",
      "[[ 0  2  3]\n",
      " [ 4  6  7]\n",
      " [ 8 10 11]]\n",
      "包含从数组中删除的替代值的切片：\n",
      "[ 2  4  6  8 10]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(12).reshape(3,4)\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('未传递 Axis 参数。 在插入之前输入数组会被展开。')\n",
    "print (np.delete(a,5))\n",
    "print ('删除第二列：')\n",
    "print (np.delete(a,1,axis = 1))\n",
    "print ('包含从数组中删除的替代值的切片：')\n",
    "a = np.array([1,2,3,4,5,6,7,8,9,10])\n",
    "print (np.delete(a, np.s_[::2]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "12f04e03-4083-4bb4-9171-bfb218e85f9b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[5 2 6 2 7 5 6 8 2 9]\n",
      "第一个数组的去重值：\n",
      "[2 5 6 7 8 9]\n",
      "去重数组的索引数组：\n",
      "[1 0 2 4 7 9]\n",
      "我们可以看到每个和原数组下标对应的数值：\n",
      "[5 2 6 2 7 5 6 8 2 9]\n",
      "去重数组的下标：\n",
      "[2 5 6 7 8 9]\n",
      "下标为：\n",
      "[1 0 2 0 3 1 2 4 0 5]\n",
      "使用下标重构原数组：\n",
      "[5 2 6 2 7 5 6 8 2 9]\n",
      "返回去重元素的重复数量：\n",
      "[2 5 6 7 8 9]\n",
      "[3 2 2 1 1 1]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([5,2,6,2,7,5,6,8,2,9])\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('第一个数组的去重值：')\n",
    "u = np.unique(a)\n",
    "print (u)\n",
    "print ('去重数组的索引数组：')\n",
    "u,indices = np.unique(a, return_index = True)\n",
    "print (indices)\n",
    "print ('我们可以看到每个和原数组下标对应的数值：')\n",
    "print (a)\n",
    "print ('去重数组的下标：')\n",
    "u,indices = np.unique(a,return_inverse = True)\n",
    "print (u)\n",
    "print ('下标为：')\n",
    "print (indices)\n",
    "print ('使用下标重构原数组：')\n",
    "print (u[indices])\n",
    "print ('返回去重元素的重复数量：')\n",
    "u,indices = np.unique(a,return_counts = True)\n",
    "print (u)\n",
    "print (indices)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "6a6f761f-9166-4023-923b-61182fa1cafa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AND: [False False False]\n",
      "OR: [ True  True  True]\n",
      "XOR: [ True  True  True]\n",
      "NOT: [False  True False]\n",
      "Invert: [-2 -3]\n",
      "Left Shift: 20\n",
      "Right Shift: 5\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.array([True, False, True], dtype=bool)\n",
    "arr2 = np.array([False, True, False], dtype=bool)\n",
    "result_and = np.bitwise_and(arr1, arr2)\n",
    "result_or = np.bitwise_or(arr1, arr2)\n",
    "result_xor = np.bitwise_xor(arr1, arr2)\n",
    "result_not = np.bitwise_not(arr1)\n",
    "print(\"AND:\", result_and)  # [False, False, False]\n",
    "print(\"OR:\", result_or)    # [True, True, True]\n",
    "print(\"XOR:\", result_xor)  # [True, True, True]\n",
    "print(\"NOT:\", result_not)  # [False, True, False]\n",
    "# 按位取反\n",
    "arr_invert = np.invert(np.array([1, 2], dtype=np.int8))\n",
    "print(\"Invert:\", arr_invert)  # [-2, -3]\n",
    "# 左移位运算\n",
    "arr_left_shift = np.left_shift(5, 2)\n",
    "print(\"Left Shift:\", arr_left_shift)  # 20\n",
    "# 右移位运算\n",
    "arr_right_shift = np.right_shift(10, 1)\n",
    "print(\"Right Shift:\", arr_right_shift)  # 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "d04badd9-718e-4491-bbec-d7e9b892923e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "13 和 17 的二进制形式：\n",
      "0b1101 0b10001\n",
      "13 和 17 的位与：\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "print ('13 和 17 的二进制形式：')\n",
    "a,b = 13,17\n",
    "print (bin(a), bin(b))\n",
    "print ('13 和 17 的位与：')\n",
    "print (np.bitwise_and(13, 17))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "b3ec9289-cacb-479f-a95a-5e3197a4b2e5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "13 和 17 的二进制形式：\n",
      "0b1101 0b10001\n",
      "13 和 17 的位或：\n",
      "29\n"
     ]
    }
   ],
   "source": [
    "a,b = 13,17 \n",
    "print ('13 和 17 的二进制形式：')\n",
    "print (bin(a), bin(b))\n",
    "print ('13 和 17 的位或：')\n",
    "print (np.bitwise_or(13, 17))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "f1cde54a-1f7d-44c7-a39c-d0319fe12bd1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "13 的位反转，其中 ndarray 的 dtype 是 uint8：\n",
      "[242]\n",
      "13 的二进制表示：\n",
      "00001101\n",
      "242 的二进制表示：\n",
      "11110010\n"
     ]
    }
   ],
   "source": [
    "print ('13 的位反转，其中 ndarray 的 dtype 是 uint8：')\n",
    "print (np.invert(np.array([13], dtype = np.uint8)))\n",
    "# 比较 13 和 242 的二进制表示，我们发现了位的反转\n",
    "print ('13 的二进制表示：')\n",
    "print (np.binary_repr(13, width = 8))\n",
    "print ('242 的二进制表示：')\n",
    "print (np.binary_repr(242, width = 8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "2dba958b-687a-4a2b-b059-f1a965053689",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "将 10 左移两位：\n",
      "40\n",
      "10 的二进制表示：\n",
      "00001010\n",
      "40 的二进制表示：\n",
      "00101000\n"
     ]
    }
   ],
   "source": [
    "print ('将 10 左移两位：')\n",
    "print (np.left_shift(10,2))\n",
    "print ('10 的二进制表示：')\n",
    "print (np.binary_repr(10, width = 8))\n",
    "print ('40 的二进制表示：')\n",
    "print (np.binary_repr(40, width = 8))\n",
    "#  '00001010' 中的两位移动到了左边，并在右边添加了两个 0。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "18f04b35-1270-42d4-8142-1349c9c732db",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "将 40 右移两位：\n",
      "10\n",
      "40 的二进制表示：\n",
      "00101000\n",
      "10 的二进制表示：\n",
      "00001010\n"
     ]
    }
   ],
   "source": [
    "print ('将 40 右移两位：')\n",
    "print (np.right_shift(40,2))\n",
    "print ('40 的二进制表示：')\n",
    "print (np.binary_repr(40, width = 8))\n",
    "print ('10 的二进制表示：')\n",
    "print (np.binary_repr(10, width = 8))\n",
    "#  '00001010' 中的两位移动到了右边，并在左边添加了两个 0。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26c86362-57d4-4a8b-a986-1c3b4c8dcec2",
   "metadata": {},
   "source": [
    "# 字符串函数\n",
    "\n",
    "|函数|描述|\n",
    "|--|--|\n",
    "|add()|对两个数组的逐个字符串元素进行连接|\n",
    "|multiply()|返回按元素多重连接后的字符串|\n",
    "|center()|居中字符串|\n",
    "|capitalize()|将字符串第一个字母转换为大写|\n",
    "|title()|将字符串的每个单词的第一个字母转换为大写|\n",
    "|lower()|数组元素转换为小写|\n",
    "|upper()|数组元素转换为大写|\n",
    "|split()|指定分隔符对字符串进行分割，并返回数组列表|\n",
    "|splitlines()|返回元素中的行列表，以换行符分割|\n",
    "|strip()|移除元素开头或者结尾处的特定字符|\n",
    "|join()|通过指定分隔符来连接数组中的元素|\n",
    "|replace()|使用新字符串替换字符串中的所有子字符串|\n",
    "|decode()|数组元素依次调用str.decode|\n",
    "|encode()|数组元素依次调用str.encode|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "783aac92-c9d5-4182-ac90-53ca26fc307e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "连接两个字符串：\n",
      "['hello xyz']\n",
      "连接示例：\n",
      "['hello abc' 'hi xyz']\n"
     ]
    }
   ],
   "source": [
    "print ('连接两个字符串：')\n",
    "print (np.char.add(['hello'],[' xyz']))\n",
    "print ('连接示例：')\n",
    "print (np.char.add(['hello', 'hi'],[' abc', ' xyz']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "bccbb90f-4e70-4a48-8d56-a12e68e441d0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Runoob Runoob Runoob \n"
     ]
    }
   ],
   "source": [
    "print (np.char.multiply('Runoob ',3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "33f9bf30-ec96-4d18-8e24-fb3fa014eb9b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*******Runoob*******\n"
     ]
    }
   ],
   "source": [
    "# np.char.center(str , width,fillchar) ：\n",
    "# str: 字符串，width: 长度，fillchar: 填充字符\n",
    "print (np.char.center('Runoob', 20,fillchar = '*'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "0c490142-2bcf-4ed5-b31c-8580c84b6f7a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Runoob\n"
     ]
    }
   ],
   "source": [
    "print (np.char.capitalize('runoob'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "eb24d124-001f-43ff-8dd6-bcd5d48a845a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I Like Runoob\n"
     ]
    }
   ],
   "source": [
    "print (np.char.title('i like runoob'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "032f7cad-3d3e-42ec-af08-83ee83b31c2d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['runoob' 'google']\n",
      "runoob\n"
     ]
    }
   ],
   "source": [
    "#操作数组\n",
    "print (np.char.lower(['RUNOOB','GOOGLE']))\n",
    " \n",
    "# 操作字符串\n",
    "print (np.char.lower('RUNOOB'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "b225e08a-43b4-4f0e-bf34-70b30773f669",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['RUNOOB' 'GOOGLE']\n",
      "RUNOOB\n"
     ]
    }
   ],
   "source": [
    "#操作数组\n",
    "print (np.char.upper(['runoob','google']))\n",
    " \n",
    "# 操作字符串\n",
    "print (np.char.upper('runoob'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "da5c1f0e-2f2b-4ca4-b1ec-3da0ce81904a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['i', 'like', 'runoob?']\n",
      "['www', 'runoob', 'com']\n"
     ]
    }
   ],
   "source": [
    "# 分隔符默认为空格\n",
    "print (np.char.split ('i like runoob?'))\n",
    "# 分隔符为 .\n",
    "print (np.char.split ('www.runoob.com', sep = '.'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "db2b061a-4e3b-4404-9f9f-a98771bcb01f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['i', 'like runoob?']\n",
      "['i', 'like runoob?']\n"
     ]
    }
   ],
   "source": [
    "# 换行符 \\n\n",
    "print (np.char.splitlines('i\\nlike runoob?')) \n",
    "print (np.char.splitlines('i\\rlike runoob?'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "94938d63-d692-480c-8bdd-faf16c3a47f2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "shok arunoob\n",
      "['runoob' 'dmin' 'jav']\n"
     ]
    }
   ],
   "source": [
    "# 移除字符串头尾的 a 字符\n",
    "print (np.char.strip('ashok arunooba','a'))\n",
    " \n",
    "# 移除数组元素头尾的 a 字符\n",
    "print (np.char.strip(['arunooba','admin','java'],'a'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "dc8e1cb8-77e0-4dcf-8aea-b6eff3282a92",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "r:u:n:o:o:b\n",
      "['r:u:n:o:o:b' 'g-o-o-g-l-e']\n"
     ]
    }
   ],
   "source": [
    "# 操作字符串\n",
    "print (np.char.join(':','runoob'))\n",
    " \n",
    "# 指定多个分隔符操作数组元素\n",
    "print (np.char.join([':','-'],['runoob','google']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "1f3fb8df-c3d8-473b-8cd3-bf58c4b00361",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i like runccb\n"
     ]
    }
   ],
   "source": [
    "print (np.char.replace ('i like runoob', 'oo', 'cc'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "1720f436-6444-4de6-91a8-7b67278731db",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "np.bytes_(b'\\x99\\xa4\\x95\\x96\\x96\\x82')\n"
     ]
    }
   ],
   "source": [
    "a = np.char.encode('runoob', 'cp500') \n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "75319f16-c9fd-4751-9b3b-8660249eb035",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "np.bytes_(b'\\x99\\xa4\\x95\\x96\\x96\\x82')\n",
      "runoob\n"
     ]
    }
   ],
   "source": [
    "a = np.char.encode('runoob', 'cp500') \n",
    "print (a)\n",
    "print (np.char.decode(a,'cp500'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "3063cd89-5284-4e96-91da-cc1baf6dfc0c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "不同角度的正弦值：\n",
      "[0.         0.5        0.70710678 0.8660254  1.        ]\n",
      "数组中角度的余弦值：\n",
      "[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01\n",
      " 6.12323400e-17]\n",
      "数组中角度的正切值：\n",
      "[0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00\n",
      " 1.63312394e+16]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([0,30,45,60,90])\n",
    "print ('不同角度的正弦值：')\n",
    "# 通过乘 pi/180 转化为弧度  \n",
    "print (np.sin(a*np.pi/180))\n",
    "print ('数组中角度的余弦值：')\n",
    "print (np.cos(a*np.pi/180))\n",
    "print ('数组中角度的正切值：')\n",
    "print (np.tan(a*np.pi/180))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "212f8225-2284-4573-bca3-e84ba3f98ddc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "含有正弦值的数组：\n",
      "[0.         0.5        0.70710678 0.8660254  1.        ]\n",
      "计算角度的反正弦，返回值以弧度为单位：\n",
      "[0.         0.52359878 0.78539816 1.04719755 1.57079633]\n",
      "通过转化为角度制来检查结果：\n",
      "[ 0. 30. 45. 60. 90.]\n",
      "arccos 和 arctan 函数行为类似：\n",
      "[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01\n",
      " 6.12323400e-17]\n",
      "反余弦：\n",
      "[0.         0.52359878 0.78539816 1.04719755 1.57079633]\n",
      "角度制单位：\n",
      "[ 0. 30. 45. 60. 90.]\n",
      "tan 函数：\n",
      "[0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00\n",
      " 1.63312394e+16]\n",
      "反正切：\n",
      "[0.         0.52359878 0.78539816 1.04719755 1.57079633]\n",
      "角度制单位：\n",
      "[ 0. 30. 45. 60. 90.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([0,30,45,60,90])  \n",
    "print ('含有正弦值的数组：')\n",
    "sin = np.sin(a*np.pi/180)  \n",
    "print (sin)\n",
    "print ('计算角度的反正弦，返回值以弧度为单位：')\n",
    "inv = np.arcsin(sin)  \n",
    "print (inv)\n",
    "print ('通过转化为角度制来检查结果：')\n",
    "print (np.degrees(inv))\n",
    "print ('arccos 和 arctan 函数行为类似：')\n",
    "cos = np.cos(a*np.pi/180)  \n",
    "print (cos)\n",
    "print ('反余弦：')\n",
    "inv = np.arccos(cos)  \n",
    "print (inv)\n",
    "print ('角度制单位：')\n",
    "print (np.degrees(inv))\n",
    "print ('tan 函数：')\n",
    "tan = np.tan(a*np.pi/180)  \n",
    "print (tan)\n",
    "print ('反正切：')\n",
    "inv = np.arctan(tan)  \n",
    "print (inv)\n",
    "print ('角度制单位：')\n",
    "print (np.degrees(inv))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "a37db469-a610-4e14-b0ab-eba29cb7d529",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[  1.      5.55  123.      0.567  25.532]\n",
      "舍入后：\n",
      "[  1.   6. 123.   1.  26.]\n",
      "[  1.    5.6 123.    0.6  25.5]\n",
      "[  0.  10. 120.   0.  30.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1.0,5.55,  123,  0.567,  25.532])  \n",
    "print  ('原数组：')\n",
    "print (a)\n",
    "print ('舍入后：')\n",
    "print (np.around(a))\n",
    "print (np.around(a, decimals =  1))\n",
    "print (np.around(a, decimals =  -1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "f73d005d-2db8-4599-9fcd-adc29d73d3a8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提供的数组：\n",
      "[-1.7  1.5 -0.2  0.6 10. ]\n",
      "修改后的数组：\n",
      "[-2.  1. -1.  0. 10.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([-1.7,  1.5,  -0.2,  0.6,  10])\n",
    "print ('提供的数组：')\n",
    "print (a)\n",
    "print ('修改后的数组：')\n",
    "print (np.floor(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "4c2479e8-54a7-4263-841c-12830d0d65fa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提供的数组：\n",
      "[-1.7  1.5 -0.2  0.6 10. ]\n",
      "修改后的数组：\n",
      "[-1.  2. -0.  1. 10.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([-1.7,  1.5,  -0.2,  0.6,  10])  \n",
    "print  ('提供的数组：')\n",
    "print (a)\n",
    "print ('修改后的数组：')\n",
    "print (np.ceil(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "65c0b0c6-1802-4b5d-976e-30ca88ed836a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[0. 1. 2.]\n",
      " [3. 4. 5.]\n",
      " [6. 7. 8.]]\n",
      "第二个数组：\n",
      "[10 10 10]\n",
      "两个数组相加：\n",
      "[[10. 11. 12.]\n",
      " [13. 14. 15.]\n",
      " [16. 17. 18.]]\n",
      "两个数组相减：\n",
      "[[-10.  -9.  -8.]\n",
      " [ -7.  -6.  -5.]\n",
      " [ -4.  -3.  -2.]]\n",
      "两个数组相乘：\n",
      "[[ 0. 10. 20.]\n",
      " [30. 40. 50.]\n",
      " [60. 70. 80.]]\n",
      "两个数组相除：\n",
      "[[0.  0.1 0.2]\n",
      " [0.3 0.4 0.5]\n",
      " [0.6 0.7 0.8]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(9, dtype = np.float64).reshape(3,3)  \n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('第二个数组：')\n",
    "b = np.array([10,10,10])  \n",
    "print (b)\n",
    "print ('两个数组相加：')\n",
    "print (np.add(a,b))\n",
    "print ('两个数组相减：')\n",
    "print (np.subtract(a,b))\n",
    "print ('两个数组相乘：')\n",
    "print (np.multiply(a,b))\n",
    "print ('两个数组相除：')\n",
    "print (np.divide(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "08b54c91-9bc3-4270-abf3-9a6be3bf0545",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[  0.25   1.33   1.   100.  ]\n",
      "调用 reciprocal 函数：\n",
      "[4.        0.7518797 1.        0.01     ]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([0.25,  1.33,  1,  100])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 reciprocal 函数：')\n",
    "print (np.reciprocal(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "58d52ec8-bfdb-4d74-875a-604ad63f305a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是；\n",
      "[  10  100 1000]\n",
      "调用 power 函数：\n",
      "[    100   10000 1000000]\n",
      "第二个数组：\n",
      "[1 2 3]\n",
      "再次调用 power 函数：\n",
      "[        10      10000 1000000000]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([10,100,1000])  \n",
    "print ('我们的数组是；')\n",
    "print (a)\n",
    "print ('调用 power 函数：')\n",
    "print (np.power(a,2))\n",
    "print ('第二个数组：')\n",
    "b = np.array([1,2,3])  \n",
    "print (b)\n",
    "print ('再次调用 power 函数：')\n",
    "print (np.power(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "6858cb80-0814-45b1-a472-0f8494659b20",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[10 20 30]\n",
      "第二个数组：\n",
      "[3 5 7]\n",
      "调用 mod() 函数：\n",
      "[1 0 2]\n",
      "调用 remainder() 函数：\n",
      "[1 0 2]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([10,20,30]) \n",
    "b = np.array([3,5,7])  \n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('第二个数组：')\n",
    "print (b)\n",
    "print ('调用 mod() 函数：')\n",
    "print (np.mod(a,b))\n",
    "print ('调用 remainder() 函数：')\n",
    "print (np.remainder(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "8fdb5fc6-c565-4386-a002-9660a68d0d3b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[3 7 5]\n",
      " [8 4 3]\n",
      " [2 4 9]]\n",
      "调用 amin() 函数：\n",
      "[3 3 2]\n",
      "再次调用 amin() 函数：\n",
      "[2 4 3]\n",
      "调用 amax() 函数：\n",
      "9\n",
      "再次调用 amax() 函数：\n",
      "[8 7 9]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[3,7,5],[8,4,3],[2,4,9]])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 amin() 函数：')\n",
    "print (np.amin(a,1))\n",
    "print ('再次调用 amin() 函数：')\n",
    "print (np.amin(a,0))\n",
    "print ('调用 amax() 函数：')\n",
    "print (np.amax(a))\n",
    "print ('再次调用 amax() 函数：')\n",
    "print (np.amax(a, axis =  0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "8040f41c-d79f-4032-90ba-58cbb1d84eef",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[3 7 5]\n",
      " [8 4 3]\n",
      " [2 4 9]]\n",
      "调用 ptp() 函数：\n",
      "7\n",
      "沿轴 1 调用 ptp() 函数：\n",
      "[4 5 7]\n",
      "沿轴 0 调用 ptp() 函数：\n",
      "[6 3 6]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[3,7,5],[8,4,3],[2,4,9]])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 ptp() 函数：')\n",
    "print (np.ptp(a))\n",
    "print ('沿轴 1 调用 ptp() 函数：')\n",
    "print (np.ptp(a, axis =  1))\n",
    "print ('沿轴 0 调用 ptp() 函数：')\n",
    "print (np.ptp(a, axis =  0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "ce4e6ce0-9e05-455c-9c53-33cbaa709a2a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[10  7  4]\n",
      " [ 3  2  1]]\n",
      "调用 percentile() 函数：\n",
      "3.5\n",
      "[6.5 4.5 2.5]\n",
      "[7. 2.]\n",
      "[[7.]\n",
      " [2.]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[10, 7, 4], [3, 2, 1]])\n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 percentile() 函数：')\n",
    "# 50% 的分位数，就是 a 里排序之后的中位数\n",
    "print (np.percentile(a, 50)) \n",
    "# axis 为 0，在纵列上求\n",
    "print (np.percentile(a, 50, axis=0)) \n",
    "# axis 为 1，在横行上求\n",
    "print (np.percentile(a, 50, axis=1)) \n",
    "# 保持维度不变\n",
    "print (np.percentile(a, 50, axis=1, keepdims=True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "159c13cd-0b3f-480f-ad95-24cd4f56fd13",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[30 65 70]\n",
      " [80 95 10]\n",
      " [50 90 60]]\n",
      "调用 median() 函数：\n",
      "65.0\n",
      "沿轴 0 调用 median() 函数：\n",
      "[50. 90. 60.]\n",
      "沿轴 1 调用 median() 函数：\n",
      "[65. 80. 60.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[30,65,70],[80,95,10],[50,90,60]])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 median() 函数：')\n",
    "print (np.median(a))\n",
    "print ('沿轴 0 调用 median() 函数：')\n",
    "print (np.median(a, axis =  0))\n",
    "print ('沿轴 1 调用 median() 函数：')\n",
    "print (np.median(a, axis =  1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "28c15cc2-2102-4faf-b1a4-95a53322ce85",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[1 2 3]\n",
      " [3 4 5]\n",
      " [4 5 6]]\n",
      "调用 mean() 函数：\n",
      "3.6666666666666665\n",
      "沿轴 0 调用 mean() 函数：\n",
      "[2.66666667 3.66666667 4.66666667]\n",
      "沿轴 1 调用 mean() 函数：\n",
      "[2. 4. 5.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[3,4,5],[4,5,6]])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 mean() 函数：')\n",
    "print (np.mean(a))\n",
    "print ('沿轴 0 调用 mean() 函数：')\n",
    "print (np.mean(a, axis =  0))\n",
    "print ('沿轴 1 调用 mean() 函数：')\n",
    "print (np.mean(a, axis =  1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "3c4be511-fb71-4a63-b847-125b2fe9099b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[1 2 3 4]\n",
      "调用 average() 函数：\n",
      "2.5\n",
      "再次调用 average() 函数：\n",
      "2.0\n",
      "权重的和：\n",
      "(np.float64(2.0), np.float64(10.0))\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,2,3,4])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 average() 函数：')\n",
    "print (np.average(a))\n",
    "# 不指定权重时相当于 mean 函数\n",
    "wts = np.array([4,3,2,1])  \n",
    "print ('再次调用 average() 函数：')\n",
    "print (np.average(a,weights = wts))\n",
    "# 如果 returned 参数设为 true，则返回权重的和  \n",
    "print ('权重的和：')\n",
    "print (np.average([1,2,3,  4],weights =  [4,3,2,1], returned =  True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "211486c0-744d-48db-aab1-d7265ceeb36b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[0 1]\n",
      " [2 3]\n",
      " [4 5]]\n",
      "修改后的数组：\n",
      "[0.625 2.625 4.625]\n",
      "修改后的数组：\n",
      "(array([0.625, 2.625, 4.625]), array([8., 8., 8.]))\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(6).reshape(3,2)  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('修改后的数组：')\n",
    "wt = np.array([3,5])  \n",
    "print (np.average(a, axis =  1, weights = wt))\n",
    "print ('修改后的数组：')\n",
    "print (np.average(a, axis =  1, weights = wt, returned =  True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "3e5db350-bf6a-4f3a-83f2-078432136395",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.118033988749895\n"
     ]
    }
   ],
   "source": [
    "print (np.std([1,2,3,4]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "8460ee7c-79b3-43e1-8ab8-f4c96cff4656",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.25\n"
     ]
    }
   ],
   "source": [
    "print (np.var([1,2,3,4]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42c90b76-c35c-4a3a-aac0-8739bf22ae9d",
   "metadata": {},
   "source": [
    "# numpy.sort(a, axis, kind, order)\n",
    "\n",
    "- a: 要排序的数组\n",
    "- axis: 沿着它排序数组的轴，如果没有数组会被展开，沿着最后的轴排序， axis=0 按列排序，axis=1 按行排序\n",
    "- kind: 默认为'quicksort'（快速排序）\n",
    "- order: 如果数组包含字段，则是要排序的字段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "a09d6522-15fa-456a-b729-7d59308124ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[3 7]\n",
      " [9 1]]\n",
      "调用 sort() 函数：\n",
      "[[3 7]\n",
      " [1 9]]\n",
      "按列排序：\n",
      "[[3 1]\n",
      " [9 7]]\n",
      "我们的数组是：\n",
      "[(b'raju', 21) (b'anil', 25) (b'ravi', 17) (b'amar', 27)]\n",
      "按 name 排序：\n",
      "[(b'amar', 27) (b'anil', 25) (b'raju', 21) (b'ravi', 17)]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[3,7],[9,1]])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 sort() 函数：')\n",
    "print (np.sort(a))\n",
    "print ('按列排序：')\n",
    "print (np.sort(a, axis =  0))\n",
    "# 在 sort 函数中排序字段 \n",
    "dt = np.dtype([('name',  'S10'),('age',  int)]) \n",
    "a = np.array([(\"raju\",21),(\"anil\",25),(\"ravi\",  17),  (\"amar\",27)], dtype = dt)  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('按 name 排序：')\n",
    "print (np.sort(a, order =  'name'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "91beb2fe-033a-4eca-9607-8e53dda3f431",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[3 1 2]\n",
      "对 x 调用 argsort() 函数：\n",
      "[1 2 0]\n",
      "以排序后的顺序重构原数组：\n",
      "[1 2 3]\n",
      "使用循环重构原数组：\n",
      "1 2 3 "
     ]
    }
   ],
   "source": [
    "x = np.array([3,  1,  2])  \n",
    "print ('我们的数组是：')\n",
    "print (x)\n",
    "print ('对 x 调用 argsort() 函数：')\n",
    "y = np.argsort(x)  \n",
    "print (y)\n",
    "print ('以排序后的顺序重构原数组：')\n",
    "print (x[y])\n",
    "print ('使用循环重构原数组：')\n",
    "for i in y:  \n",
    "    print (x[i], end=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "b03c48f0-9520-4a59-a599-b26c3173f21f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "调用 lexsort() 函数：\n",
      "[3 1 0 2]\n",
      "使用这个索引来获取排序后的数据：\n",
      "['amar, f.y.', 'anil, s.y.', 'raju, f.y.', 'ravi, s.y.']\n"
     ]
    }
   ],
   "source": [
    "nm =  ('raju','anil','ravi','amar') \n",
    "dv =  ('f.y.',  's.y.',  's.y.',  'f.y.') \n",
    "ind = np.lexsort((dv,nm))  \n",
    "print ('调用 lexsort() 函数：') \n",
    "print (ind)\n",
    "print ('使用这个索引来获取排序后的数据：') \n",
    "print ([nm[i]  +  \", \"  + dv[i]  for i in ind])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "bd28a745-ce63-4071-80b2-a21fbc2ab41c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.+0.j, 2.+0.j, 3.+0.j, 5.+0.j, 6.+0.j])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sort_complex([5, 3, 6, 2, 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "92210f84-e44b-41a0-b6d2-cf999edff50c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.+2.j, 2.-1.j, 3.-3.j, 3.-2.j, 3.+5.j])"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sort_complex([1 + 2j, 2 - 1j, 3 - 2j, 3 - 3j, 3 + 5j])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "a599255c-70b9-4839-9e66-61799cfd8ea7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4])"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([3, 4, 2, 1])\n",
    "np.partition(a, 3)  # 将数组 a 中所有元素（包括重复元素）从小到大排列，3 表示的是排序数组索引为 3 的数字，比该数字小的排在该数字前面，比该数字大的排在该数字的后面"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "5ef65eaf-8f3b-4736-b4cc-9d01f90e79b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4])"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.partition(a, (1, 3)) # 小于 1 的在前面，大于 3 的在后面，1和3之间的在中间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "1b672127-64c1-4331-8422-33c73206bcd8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.int64(10)"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr = np.array([46, 57, 23, 39, 1, 10, 0, 120])\n",
    "arr[np.argpartition(arr, 2)[2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "7a0620f9-5fb0-42f8-912c-fe121a13bc4a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.int64(57)"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[np.argpartition(arr, -2)[-2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "dc288874-f3ec-4748-b9e8-b436958b37b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.int64(10)"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[np.argpartition(arr, [2,3])[2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "1cf102c4-c9d2-4bb4-adbc-3813de11f207",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.int64(23)"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[np.argpartition(arr, [2,3])[3]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "8c2f2453-2976-428b-a341-7a3086e6e2b7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[30 40 70]\n",
      " [80 20 10]\n",
      " [50 90 60]]\n",
      "调用 argmax() 函数：\n",
      "7\n",
      "展开数组：\n",
      "[30 40 70 80 20 10 50 90 60]\n",
      "沿轴 0 的最大值索引：\n",
      "[1 2 0]\n",
      "沿轴 1 的最大值索引：\n",
      "[2 0 1]\n",
      "调用 argmin() 函数：\n",
      "5\n",
      "展开数组中的最小值：\n",
      "10\n",
      "沿轴 0 的最小值索引：\n",
      "[0 1 1]\n",
      "沿轴 1 的最小值索引：\n",
      "[0 2 0]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[30,40,70],[80,20,10],[50,90,60]])  \n",
    "print  ('我们的数组是：') \n",
    "print (a)\n",
    "print ('调用 argmax() 函数：') \n",
    "print (np.argmax(a))\n",
    "print ('展开数组：') \n",
    "print (a.flatten())\n",
    "print ('沿轴 0 的最大值索引：') \n",
    "maxindex = np.argmax(a, axis =  0)  \n",
    "print (maxindex)\n",
    "print ('沿轴 1 的最大值索引：') \n",
    "maxindex = np.argmax(a, axis =  1)  \n",
    "print (maxindex)\n",
    "print ('调用 argmin() 函数：') \n",
    "minindex = np.argmin(a)  \n",
    "print (minindex)\n",
    "print ('展开数组中的最小值：') \n",
    "print (a.flatten()[minindex])\n",
    "print ('沿轴 0 的最小值索引：') \n",
    "minindex = np.argmin(a, axis =  0)  \n",
    "print (minindex)\n",
    "print ('沿轴 1 的最小值索引：') \n",
    "minindex = np.argmin(a, axis =  1)  \n",
    "print (minindex)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "3c639ede-0513-4259-9164-833855027bf5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[30 40  0]\n",
      " [ 0 20 10]\n",
      " [50  0 60]]\n",
      "调用 nonzero() 函数：\n",
      "(array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[30,40,0],[0,20,10],[50,0,60]])  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 nonzero() 函数：')\n",
    "print (np.nonzero (a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "021e13f3-d2c8-4ff9-9635-1e7ad2dc7fa1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[0. 1. 2.]\n",
      " [3. 4. 5.]\n",
      " [6. 7. 8.]]\n",
      "大于 3 的元素的索引：\n",
      "(array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))\n",
      "使用这些索引来获取满足条件的元素：\n",
      "[4. 5. 6. 7. 8.]\n"
     ]
    }
   ],
   "source": [
    "x = np.arange(9.).reshape(3,  3)  \n",
    "print ('我们的数组是：')\n",
    "print (x)\n",
    "print ( '大于 3 的元素的索引：')\n",
    "y = np.where(x >  3)  \n",
    "print (y)\n",
    "print ('使用这些索引来获取满足条件的元素：')\n",
    "print (x[y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "9faa187f-2007-4980-99e8-117c64fb2c7c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[[0. 1. 2.]\n",
      " [3. 4. 5.]\n",
      " [6. 7. 8.]]\n",
      "按元素的条件值：\n",
      "[[ True False  True]\n",
      " [False  True False]\n",
      " [ True False  True]]\n",
      "使用条件提取元素：\n",
      "[0. 2. 4. 6. 8.]\n"
     ]
    }
   ],
   "source": [
    "x = np.arange(9.).reshape(3,  3)  \n",
    "print ('我们的数组是：')\n",
    "print (x)\n",
    "# 定义条件, 选择偶数元素\n",
    "condition = np.mod(x,2)  ==  0  \n",
    "print ('按元素的条件值：')\n",
    "print (condition)\n",
    "print ('使用条件提取元素：')\n",
    "print (np.extract(condition, x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "id": "b24b0e19-2b04-4975-867a-c5ccedca464d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[   1  256 8755]\n",
      "以十六进制表示内存中的数据：\n",
      "<map object at 0x7fb547f0a6e0>\n",
      "调用 byteswap() 函数：\n",
      "[  256     1 13090]\n",
      "十六进制形式：\n",
      "<map object at 0x7fb547f0a860>\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,  256,  8755], dtype = np.int16)  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('以十六进制表示内存中的数据：')\n",
    "print (map(hex,a))\n",
    "# byteswap() 函数通过传入 true 来原地交换 \n",
    "print ('调用 byteswap() 函数：')\n",
    "print (a.byteswap(True))\n",
    "print ('十六进制形式：')\n",
    "print (map(hex,a))\n",
    "# 我们可以看到字节已经交换了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "c710801d-e45d-44e3-9ca0-cf0439f802c1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组是：\n",
      "[0 1 2 3 4 5]\n",
      "调用 id() 函数：\n",
      "140416573617712\n",
      "a 赋值给 b：\n",
      "[0 1 2 3 4 5]\n",
      "b 拥有相同 id()：\n",
      "140416573617712\n",
      "修改 b 的形状：\n",
      "[[0 1]\n",
      " [2 3]\n",
      " [4 5]]\n",
      "a 的形状也修改了：\n",
      "[[0 1]\n",
      " [2 3]\n",
      " [4 5]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(6)  \n",
    "print ('我们的数组是：')\n",
    "print (a)\n",
    "print ('调用 id() 函数：')\n",
    "print (id(a))\n",
    "print ('a 赋值给 b：')\n",
    "b = a \n",
    "print (b)\n",
    "print ('b 拥有相同 id()：')\n",
    "print (id(b))\n",
    "print ('修改 b 的形状：')\n",
    "b.shape =  3,2  \n",
    "print (b)\n",
    "print ('a 的形状也修改了：')\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "2529621a-6670-4ce4-bccf-0863891dc422",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数组 a：\n",
      "[[0 1]\n",
      " [2 3]\n",
      " [4 5]]\n",
      "创建 a 的视图：\n",
      "[[0 1]\n",
      " [2 3]\n",
      " [4 5]]\n",
      "两个数组的 id() 不同：\n",
      "a 的 id()：\n",
      "140416573619344\n",
      "b 的 id()：\n",
      "140416573619440\n",
      "b 的形状：\n",
      "[[0 1 2]\n",
      " [3 4 5]]\n",
      "a 的形状：\n",
      "[[0 1]\n",
      " [2 3]\n",
      " [4 5]]\n"
     ]
    }
   ],
   "source": [
    "# 最开始 a 是个 3X2 的数组\n",
    "a = np.arange(6).reshape(3,2)  \n",
    "print ('数组 a：')\n",
    "print (a)\n",
    "print ('创建 a 的视图：')\n",
    "b = a.view()  \n",
    "print (b)\n",
    "print ('两个数组的 id() 不同：')\n",
    "print ('a 的 id()：')\n",
    "print (id(a))\n",
    "print ('b 的 id()：' )\n",
    "print (id(b))\n",
    "# 修改 b 的形状，并不会修改 a\n",
    "b.shape =  2,3\n",
    "print ('b 的形状：')\n",
    "print (b)\n",
    "print ('a 的形状：')\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "id": "69908b85-d285-4a26-9f5b-5bb50f876078",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我们的数组：\n",
      "[ 0  1  2  3  4  5  6  7  8  9 10 11]\n",
      "创建切片：\n",
      "[  0   1   2   3 123 234   6   7   8   9  10  11]\n",
      "140416573616560 140416573619344 140416573618768\n"
     ]
    }
   ],
   "source": [
    "arr = np.arange(12)\n",
    "print ('我们的数组：')\n",
    "print (arr)\n",
    "print ('创建切片：')\n",
    "a=arr[3:]\n",
    "b=arr[3:]\n",
    "a[1]=123\n",
    "b[2]=234\n",
    "print(arr)\n",
    "print(id(a),id(b),id(arr[3:]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "id": "a798af90-5391-4beb-adea-db7515f3826d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数组 a：\n",
      "[[10 10]\n",
      " [ 2  3]\n",
      " [ 4  5]]\n",
      "创建 a 的深层副本：\n",
      "数组 b：\n",
      "[[10 10]\n",
      " [ 2  3]\n",
      " [ 4  5]]\n",
      "我们能够写入 b 来写入 a 吗？\n",
      "False\n",
      "修改 b 的内容：\n",
      "修改后的数组 b：\n",
      "[[100  10]\n",
      " [  2   3]\n",
      " [  4   5]]\n",
      "a 保持不变：\n",
      "[[10 10]\n",
      " [ 2  3]\n",
      " [ 4  5]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[10,10],  [2,3],  [4,5]])  \n",
    "print ('数组 a：')\n",
    "print (a)\n",
    "print ('创建 a 的深层副本：')\n",
    "b = a.copy()  \n",
    "print ('数组 b：')\n",
    "print (b)\n",
    "# b 与 a 不共享任何内容  \n",
    "print ('我们能够写入 b 来写入 a 吗？')\n",
    "print (b is a)\n",
    "print ('修改 b 的内容：')\n",
    "b[0,0]  =  100  \n",
    "print ('修改后的数组 b：')\n",
    "print (b)\n",
    "print ('a 保持不变：')\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "18af591a-1061-40a6-a3b7-9efce7286c6d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原数组：\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "转置数组：\n",
      "[[ 0  4  8]\n",
      " [ 1  5  9]\n",
      " [ 2  6 10]\n",
      " [ 3  7 11]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(12).reshape(3,4)\n",
    "print ('原数组：')\n",
    "print (a)\n",
    "print ('转置数组：')\n",
    "print (a.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "f1dd7cfe-3a55-4742-a4a9-665a1ea3dc4e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2. 4.]\n",
      " [6. 8.]]\n"
     ]
    }
   ],
   "source": [
    "print (np.matlib.empty((2,2)))\n",
    "# 填充为随机数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "49e03a6b-6a52-47b2-992b-11c0be639c15",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 0.]\n",
      " [0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "print (np.matlib.zeros((2,2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "69139a77-077a-4efb-bcc9-14f24f878ba0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 1.]\n",
      " [1. 1.]]\n"
     ]
    }
   ],
   "source": [
    "print (np.matlib.ones((2,2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "id": "d19b856f-be53-4a62-a1d7-09e74545f40d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 0. 0. 0.]\n",
      " [0. 1. 0. 0.]\n",
      " [0. 0. 1. 0.]]\n"
     ]
    }
   ],
   "source": [
    "print (np.matlib.eye(n =  3, M =  4, k =  0, dtype =  float))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "4d20c9ed-8847-48f9-8e1a-166a1ad65d8a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 1.]]\n"
     ]
    }
   ],
   "source": [
    "# 大小为 5，类型位浮点型\n",
    "print (np.matlib.identity(5, dtype =  float))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "id": "578be46c-859d-4d9d-b811-bbbaabb92743",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.575782   0.13564237 0.38831863]\n",
      " [0.05003507 0.48027523 0.55634628]\n",
      " [0.98895305 0.61146563 0.08476317]]\n"
     ]
    }
   ],
   "source": [
    "print (np.matlib.rand(3,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "id": "70defee3-fe47-4085-a15a-86ae13fc704d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]]\n"
     ]
    }
   ],
   "source": [
    "i = np.matrix('1,2;3,4')  \n",
    "print (i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "1335086a-82bd-49a0-b0cc-5e78bcf07064",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]]\n"
     ]
    }
   ],
   "source": [
    "j = np.asarray(i)  \n",
    "print (j)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "1e54ea76-a714-4908-9e86-a3d75cb13e47",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]]\n"
     ]
    }
   ],
   "source": [
    "k = np.asmatrix (j)  \n",
    "print (k)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8aa748b5-d94b-4ab9-a26a-b31a6af8a59f",
   "metadata": {},
   "source": [
    "# numpy.dot(a, b, out=None) \n",
    "\n",
    "- a : ndarray 数组\n",
    "- b : ndarray 数组\n",
    "- out : ndarray, 可选，用来保存dot()的计算结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "a3c6ed82-a705-4e4c-b2e5-e4150033d6dc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[37 40]\n",
      " [85 92]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4]])\n",
    "b = np.array([[11,12],[13,14]])\n",
    "print(np.dot(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "id": "879af27c-6e38-46cd-87af-dc0768591df5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "130\n"
     ]
    }
   ],
   "source": [
    "# vdot 将数组展开计算内积\n",
    "print (np.vdot(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "4315afd2-35bd-4012-b3c5-2768e9021e19",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n"
     ]
    }
   ],
   "source": [
    "print (np.inner(np.array([1,2,3]),np.array([0,1,0])))\n",
    "# 等价于 1*0+2*1+3*0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "id": "b98b9e9b-c614-4c19-94ee-75aef355e6f0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数组 a：\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "数组 b：\n",
      "[[11 12]\n",
      " [13 14]]\n",
      "内积：\n",
      "[[35 41]\n",
      " [81 95]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2], [3,4]]) \n",
    "print ('数组 a：')\n",
    "print (a)\n",
    "b = np.array([[11, 12], [13, 14]]) \n",
    "print ('数组 b：')\n",
    "print (b)\n",
    "print ('内积：')\n",
    "print (np.inner(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "id": "56fe9fda-76ec-4650-aeb2-6781aa2281ba",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4 1]\n",
      " [2 2]]\n"
     ]
    }
   ],
   "source": [
    "a = [[1,0],[0,1]] \n",
    "b = [[4,1],[2,2]] \n",
    "print (np.matmul(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "id": "c550d8d4-72af-4910-a844-d2a31061bad4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2]\n",
      "[1 2]\n"
     ]
    }
   ],
   "source": [
    "a = [[1,0],[0,1]] \n",
    "b = [1,2] \n",
    "print (np.matmul(a,b))\n",
    "print (np.matmul(b,a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "545fe0d4-569f-4673-b1c4-182bbf74c7ce",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[[ 2  3]\n",
      "  [ 6 11]]\n",
      "\n",
      " [[10 19]\n",
      "  [14 27]]]\n"
     ]
    }
   ],
   "source": [
    "a = np.arange(8).reshape(2,2,2) \n",
    "b = np.arange(4).reshape(2,2) \n",
    "print (np.matmul(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "id": "2c020015-d6e4-4286-8572-966aed6b5697",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-2.0000000000000004\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2], [3,4]])\n",
    "print (np.linalg.det(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "id": "3e990161-985f-4e05-874f-05dc622da770",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 6  1  1]\n",
      " [ 4 -2  5]\n",
      " [ 2  8  7]]\n",
      "-306.0\n",
      "-306\n"
     ]
    }
   ],
   "source": [
    "b = np.array([[6,1,1], [4, -2, 5], [2,8,7]]) \n",
    "print (b)\n",
    "print (np.linalg.det(b))\n",
    "print (6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "id": "cf93b2fb-13dc-40ef-8c53-3ff8fb9534a2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [3 4]]\n",
      "[[-2.   1. ]\n",
      " [ 1.5 -0.5]]\n",
      "[[1.0000000e+00 0.0000000e+00]\n",
      " [8.8817842e-16 1.0000000e+00]]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([[1,2],[3,4]]) \n",
    "y = np.linalg.inv(x) \n",
    "print (x)\n",
    "print (y)\n",
    "print (np.dot(x,y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "id": "cd8a6887-f2e7-4606-a9f4-b5e5c992138c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数组 a：\n",
      "[[ 1  1  1]\n",
      " [ 0  2  5]\n",
      " [ 2  5 -1]]\n",
      "a 的逆：\n",
      "[[ 1.28571429 -0.28571429 -0.14285714]\n",
      " [-0.47619048  0.14285714  0.23809524]\n",
      " [ 0.19047619  0.14285714 -0.0952381 ]]\n",
      "矩阵 b：\n",
      "[[ 6]\n",
      " [-4]\n",
      " [27]]\n",
      "计算：A^(-1)B：\n",
      "[[ 5.]\n",
      " [ 3.]\n",
      " [-2.]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) \n",
    "print ('数组 a：')\n",
    "print (a)\n",
    "ainv = np.linalg.inv(a) \n",
    "print ('a 的逆：')\n",
    "print (ainv)\n",
    "print ('矩阵 b：')\n",
    "b = np.array([[6],[-4],[27]]) \n",
    "print (b)\n",
    "print ('计算：A^(-1)B：')\n",
    "x = np.linalg.solve(a,b) \n",
    "print (x)\n",
    "# 这就是线性方向 x = 5, y = 3, z = -2 的解"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e99700b-12cf-4f4b-a69b-b44a70a65bfb",
   "metadata": {},
   "source": [
    "# numpy.save(file, arr, allow_pickle=True, fix_imports=True)\n",
    "\n",
    "- file：要保存的文件，扩展名为 .npy，如果文件路径末尾没有扩展名 .npy，该扩展名会被自动加上。\n",
    "- arr: 要保存的数组\n",
    "- allow_pickle: 可选，布尔值，允许使用 Python pickles 保存对象数组，Python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前，对对象进行序列化和反序列化。\n",
    "- fix_imports: 可选，为了方便 Pyhton2 中读取 Python3 保存的数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "id": "efedfa96-e29e-4ef8-b075-b6a540a5cf31",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.array([1,2,3,4,5]) \n",
    "# 保存到 outfile.npy 文件上\n",
    "np.save('outfile.npy',a) \n",
    "# 保存到 outfile2.npy 文件上，如果文件路径末尾没有扩展名 .npy，该扩展名会被自动加上\n",
    "np.save('outfile2',a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "id": "20552c88-6243-4a77-8bc7-625e00ec3184",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3 4 5]\n"
     ]
    }
   ],
   "source": [
    "b = np.load('outfile.npy')  \n",
    "print (b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4c4a441-ecac-45a2-b68e-6f835c161067",
   "metadata": {},
   "source": [
    "# numpy.savez(file, *args, **kwds)\n",
    "\n",
    "- file：要保存的文件，扩展名为 .npz，如果文件路径末尾没有扩展名 .npz，该扩展名会被自动加上。\n",
    "- args: 要保存的数组，可以使用关键字参数为数组起一个名字，非关键字参数传递的数组会自动起名为 arr_0, arr_1, …　。\n",
    "- kwds: 要保存的数组使用关键字名称。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "id": "54341ed5-3f2f-46d7-97b8-98e9e78ab3ac",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['sin_array', 'arr_0', 'arr_1']\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]\n",
      "[0.         0.09983342 0.19866933 0.29552021 0.38941834 0.47942554\n",
      " 0.56464247 0.64421769 0.71735609 0.78332691]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],[4,5,6]])\n",
    "b = np.arange(0, 1.0, 0.1)\n",
    "c = np.sin(b)\n",
    "# c 使用了关键字参数 sin_array\n",
    "np.savez(\"runoob.npz\", a, b, sin_array = c)\n",
    "r = np.load(\"runoob.npz\")  \n",
    "print(r.files) # 查看各个数组名称\n",
    "print(r[\"arr_0\"]) # 数组 a\n",
    "print(r[\"arr_1\"]) # 数组 b\n",
    "print(r[\"sin_array\"]) # 数组 c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "id": "39437c40-5726-4a9e-bad5-f6a8890a3b18",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1. 2. 3. 4. 5.]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,2,3,4,5])\n",
    "np.savetxt('out.txt',a)\n",
    "b = np.loadtxt('out.txt')\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "id": "0db45204-17e3-4ab0-a22c-eedd9bff7671",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 0. 1. 1. 2.]\n",
      " [2. 3. 3. 4. 4.]\n",
      " [5. 5. 6. 6. 7.]\n",
      " [7. 8. 8. 9. 9.]]\n"
     ]
    }
   ],
   "source": [
    "a=np.arange(0,10,0.5).reshape(4,-1)\n",
    "np.savetxt(\"out.txt\",a,fmt=\"%d\",delimiter=\",\") # 改为保存为整数，以逗号分隔\n",
    "b = np.loadtxt(\"out.txt\",delimiter=\",\") # load 时也要指定为逗号分隔\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "id": "6a1f7527-776c-41c4-85e2-80a4954a1006",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAXrZJREFUeJzt3XlYFXXj/vH3YTsgAorKloi4bwio5ZpZWqZmaeaCLVo9raCpZWnlliatVi7ZU78e9VvhWlpp1qPmWmqa4JKKirgLigoIynrm90df+UaiiYIDnPt1Xee6PHNm5twnknM7n8/MWAzDMBARERGxIw5mBxARERG52VSARERExO6oAImIiIjdUQESERERu6MCJCIiInZHBUhERETsjgqQiIiI2B0VIBEREbE7KkAiIiJid1SARKTMqV27NoMHDy7RfQ4ePJjatWsXWmaxWBg/fnzB8/Hjx2OxWEhJSSnR9+7UqROdOnUq0X2KyI1RARKxI7Nnz8ZisWCxWNiwYcNlrxuGQWBgIBaLhfvuu++63mPy5MksWbLkBpNenxMnTjB+/Hji4uJMeX8RKT9UgETskKurKzExMZctX7t2LceOHcNqtV73vs0uQBMmTLjmAnTx4kVef/310g0lImWSCpCIHerevTsLFy4kLy+v0PKYmBhatmyJn5+fScluLldXV5ycnMyOISImUAESsUMRERGcOXOGFStWFCzLyclh0aJFDBw4sMht3nvvPdq1a0e1atVwc3OjZcuWLFq0qNA6FouFzMxM5syZUzDUdmkuz6X5NXv37qVfv354enpSrVo1XnjhBbKysv4x88GDB+nbty/e3t5UqlSJNm3asGzZsoLX16xZw6233grA448/XvD+s2fPvuI+/z4H6JKUlJTrygjw6aefUrduXdzc3LjttttYv359ketlZ2czbtw46tWrh9VqJTAwkJdffpns7OzLMkZFRbFw4UKaNGmCm5sbbdu2ZefOnQD8+9//pl69eri6utKpUycOHTp02XstXLiQli1b4ubmRvXq1XnkkUc4fvz4NX0ekYpKBUjEDtWuXZu2bdsyd+7cgmXLly8nLS2NAQMGFLnNRx99RHh4OG+88QaTJ0/GycmJvn37FiohX3zxBVarldtvv50vvviCL774gmeeeabQfvr160dWVhbR0dF0796dqVOn8vTTT181b3JyMu3a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qlSp4Hnbtm3JyMjg6NGjV/3sf7Vnzx7at29faFn79u3Zv38/+fn5BcuaN29e8GeLxYKfnx+nTp265vcRkStTARKR65aQkMCJEyew2WwcOnToqutu3LiRhx9+mO7du7N06VJiY2N57bXXCubPXHLhwgV+//13HB0d2b9//1X3+a9//YuDBw/y6KOPsnPnTlq1asW0adOKXNfNze2q+5o3bx4vvfQSTz75JP/973+Ji4vj8ccfvyzfzeTs7FzoucViwWazmZRGpGJRARKR65KTk8MjjzxC//79mThxIv/617+uenTi119/JSgoiNdee41WrVpRv359Dh8+fNl6L774Ig4ODixfvpypU6fy888/XzVHYGAgzz77LN988w0vvvgin332WZHrhYSEYLPZWLt2bZGv//LLL7Rr147nn3+e8PBw6tWrR0JCwmXrbd++nYsXLxY837RpE5UrVyYwMBD484yvvx7FKUrjxo355ZdfLnv/Bg0a4OjoeNVtRaRkqACJyHV57bXXSEtLY+rUqQVndz3xxBNXXL9+/focOXKEefPmkZCQwNSpU1m8eHGhdZYtW8Z//vMfvvrqK+6++25GjhzJoEGDOHfuXJH7HDZsGD/99BOJiYls27aN1atX07hx4yLXrV27NoMGDeKJJ55gyZIlJCYmsmbNGhYsWFCQb+vWrfz000/s27ePMWPGsGXLlsv2k5OTw5NPPsnu3bv54YcfGDduHFFRUTg4OBS8z+bNmzl06BApKSlFHrF58cUXWbVqFRMnTmTfvn3MmTOH6dOn89JLL13xv5+IlDCzJyGJSPmzevVqw8nJyVi/fn3BssTERMPT09P4+OOPr7jdyJEjjWrVqhWcSfXBBx8YXl5ehmEYxqlTpwxfX19j8uTJBevn5OQYLVu2NPr161fwvvxlMnFUVJRRt25dw2q1GjVq1DAeffRRIyUl5Yrvf/HiRWP48OGGv7+/4eLiYtSrV8/4z3/+YxiGYWRlZRmDBw82vLy8jCpVqhjPPfecMWrUKCM0NLRg+0GDBhkPPPCAMXbs2ILP8dRTTxWa/B0fH2+0adPGcHNzMwAjMTHxstyGYRiLFi0ymjRpYjg7Oxu1atUy3n333UJZg4KCjA8++KDQstDQUGPcuHFX/Hwicu10JWgRkWs0ePBgUlNTWbJkidlRROQGaQhMRERE7I4KkIiIiNgdDYGJiIiI3dERIBEREbE7KkAiIiJid1SARERExO6oAImIiIjdUQESERERu6MCJCIiInZHBUhERETsjgqQiIiI2B0VIBEREbE7/x8vUSDq6hXjkgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt \n",
    " \n",
    "x = np.arange(1,11) \n",
    "y =  2  * x +  5 \n",
    "plt.title(\"Matplotlib demo\") \n",
    "plt.xlabel(\"x axis caption\") \n",
    "plt.ylabel(\"y axis caption\") \n",
    "plt.plot(x,y) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "id": "9404e8bb-e802-4065-96b7-97b8e6da562e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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1KkTycnJRcu5ublFUzkvvfQSDg4OTJ48GYDg4OBiIx1PPvkkTz755FXP37x586LRlP3799OjRw+eeeYZvvrqK1atWsWUKVPYt28fYWFhPP300/ztb39jypQpxUZdkpOTOXDgAJ06daJPnz5899135Ofn4+TkVKLn6u/vf9375uXl8fbbbxeNZqWkpFCzZk0sFgsWi+WGb6bo7OxMTk7OZUuliNwYlSARuSHr1q0r+u89e/YwfPhwPD09cXR0xNnZmc8++4wGDRoUO2br1q0MGjToqucNDAxk48aNZGRkFH2EvkaNGhw7dowBAwawbds2Tp8+zT333EPv3r0JCwvDxcWFvLy8S37elClTGDduHF999RXOzs5MnTqV9957jzlz5gCQmJhI3759cXFxoUqVKjd8v6L/9dtvv9GqVSvc3d1Zs2YNjz/+ODk5OcTExGBnZ8e8efNwcHAgJyfnssfHxsYSHx/PAw88UGx948aN+e233+jQoQMvvvgi0dHRN51VxNapBInIDTtx4gSzZs1i8eLFfP7556xevZpq1arRvHlz7r33XoYMGcLTTz9dNJLSqlWry174eznp6elFJchiseDv70+nTp0ICQnB29ub0aNHA398BP3pp59m+vTpPP7442zevLno02VRUVEEBATw1VdfFZ33hRde4IUXXgCufzqsJFavXk3Xrl2xWCwcOnSI2NhY7rzzTl588UXeffddHnroIYBi9yn6U2ZmJn/729+YN28e8MdH49euXUt2djadOnVi7dq11KtX77p/hyJydbowWkRKLDc3l4EDB9KyZUucnJzYsmVLsTsud+zYkc2bN+Pg4EDr1q156KGHLrmm5koMw2DDhg04ODgUTf3Url2bUaNG0atXL1xdXYtuGLh27Vp69OjBv/71L6KiohgzZgwdO3YkISEBgNtuu63Y9Ni8efOK7uBcp04d1q1bR+/evYuWhw0bdtO/mz9L0KlTp3jwwQd5//33mT59Ort27WL69OlF+yUnJxe7aeKOHTtIT0/nww8/ZNasWYSHh5OZmck777zDyZMn6dKlCwsWLGDRokVERETcdE4RAQwRkRuwePFiIysrq9i6N99805g+fXqxdRcvXjR+/PHHa55v4sSJhq+vr+Hp6Wl4e3sbs2bNKrZ94cKFRu3atY3g4GBjx44dxvnz541atWoZa9euLbbf1KlT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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib\n",
    " \n",
    "# fname 为 你下载的字体库路径，注意 SourceHanSansSC-Bold.otf 字体的路径\n",
    "zhfont1 = matplotlib.font_manager.FontProperties(fname=\"MiSans-Normal.otf\") \n",
    " \n",
    "x = np.arange(1,11) \n",
    "y =  2  * x +  5 \n",
    "plt.title(\"菜鸟教程 - 测试\", fontproperties=zhfont1) \n",
    " \n",
    "# fontproperties 设置中文显示，fontsize 设置字体大小\n",
    "plt.xlabel(\"x 轴\", fontproperties=zhfont1)\n",
    "plt.ylabel(\"y 轴\", fontproperties=zhfont1)\n",
    "plt.plot(x,y) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "id": "019abf4c-53cb-4952-ae4d-52227d9059bc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C059\n",
      "C059\n",
      "C059\n",
      "C059\n",
      "Cantarell\n",
      "Cantarell\n",
      "Cantarell\n",
      "Cantarell\n",
      "Cantarell\n",
      "D050000L\n",
      "DejaVu Math TeX Gyre\n",
      "DejaVu Math TeX Gyre\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans\n",
      "DejaVu Sans Display\n",
      "DejaVu Sans Mono\n",
      "DejaVu Sans Mono\n",
      "DejaVu Sans Mono\n",
      "DejaVu Sans Mono\n",
      "DejaVu Sans Mono\n",
      "DejaVu Sans Mono\n",
      "DejaVu Sans Mono\n",
      "DejaVu Sans Mono\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif\n",
      "DejaVu Serif Display\n",
      "Liberation Mono\n",
      "Liberation Mono\n",
      "Liberation Mono\n",
      "Liberation Mono\n",
      "Liberation Sans\n",
      "Liberation Sans\n",
      "Liberation Sans\n",
      "Liberation Sans\n",
      "Liberation Serif\n",
      "Liberation Serif\n",
      "Liberation Serif\n",
      "Liberation Serif\n",
      "Lohit Devanagari\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "MiSans\n",
      "Nimbus Mono PS\n",
      "Nimbus Mono PS\n",
      "Nimbus Mono PS\n",
      "Nimbus Mono PS\n",
      "Nimbus Roman\n",
      "Nimbus Roman\n",
      "Nimbus Roman\n",
      "Nimbus Roman\n",
      "Nimbus Sans\n",
      "Nimbus Sans\n",
      "Nimbus Sans\n",
      "Nimbus Sans\n",
      "Nimbus Sans Narrow\n",
      "Nimbus Sans Narrow\n",
      "Nimbus Sans Narrow\n",
      "Nimbus Sans Narrow\n",
      "Noto Kufi Arabic\n",
      "Noto Kufi Arabic\n",
      "Noto Looped Lao\n",
      "Noto Looped Lao\n",
      "Noto Looped Thai\n",
      "Noto Looped Thai\n",
      "Noto Mono\n",
      "Noto Music\n",
      "Noto Naskh Arabic\n",
      "Noto Naskh Arabic\n",
      "Noto Nastaliq Urdu\n",
      "Noto Nastaliq Urdu\n",
      "Noto Rashi Hebrew\n",
      "Noto Rashi Hebrew\n",
      "Noto Sans\n",
      "Noto Sans\n",
      "Noto Sans\n",
      "Noto Sans\n",
      "Noto Sans Adlam\n",
      "Noto Sans Adlam\n",
      "Noto Sans Adlam Unjoined\n",
      "Noto Sans Adlam Unjoined\n",
      "Noto Sans Anatolian Hieroglyphs\n",
      "Noto Sans Arabic\n",
      "Noto Sans Arabic\n",
      "Noto Sans Armenian\n",
      "Noto Sans Armenian\n",
      "Noto Sans Avestan\n",
      "Noto Sans Balinese\n",
      "Noto Sans Balinese\n",
      "Noto Sans Bamum\n",
      "Noto Sans Bamum\n",
      "Noto Sans Bassa Vah\n",
      "Noto Sans Batak\n",
      "Noto Sans Bengali\n",
      "Noto Sans Bengali\n",
      "Noto Sans Bhaiksuki\n",
      "Noto Sans Brahmi\n",
      "Noto Sans Buginese\n",
      "Noto Sans Buhid\n",
      "Noto Sans CJK JP\n",
      "Noto Sans CJK JP\n",
      "Noto Sans Canadian Aboriginal\n",
      "Noto Sans Canadian Aboriginal\n",
      "Noto Sans Carian\n",
      "Noto Sans Caucasian Albanian\n",
      "Noto Sans Chakma\n",
      "Noto Sans Cham\n",
      "Noto Sans Cham\n",
      "Noto Sans Cherokee\n",
      "Noto Sans Cherokee\n",
      "Noto Sans Coptic\n",
      "Noto Sans Cuneiform\n",
      "Noto Sans Cypriot\n",
      "Noto Sans Deseret\n",
      "Noto Sans Devanagari\n",
      "Noto Sans Devanagari\n",
      "Noto Sans Display\n",
      "Noto Sans Display\n",
      "Noto Sans Display\n",
      "Noto Sans Display\n",
      "Noto Sans Duployan\n",
      "Noto Sans Egyptian Hieroglyphs\n",
      "Noto Sans Elbasan\n",
      "Noto Sans Elymaic\n",
      "Noto Sans Ethiopic\n",
      "Noto Sans Ethiopic\n",
      "Noto Sans Georgian\n",
      "Noto Sans Georgian\n",
      "Noto Sans Glagolitic\n",
      "Noto Sans Gothic\n",
      "Noto Sans Grantha\n",
      "Noto Sans Gujarati\n",
      "Noto Sans Gujarati\n",
      "Noto Sans Gunjala Gondi\n",
      "Noto Sans Gurmukhi\n",
      "Noto Sans Gurmukhi\n",
      "Noto Sans Hanifi Rohingya\n",
      "Noto Sans Hanifi Rohingya\n",
      "Noto Sans Hanunoo\n",
      "Noto Sans Hatran\n",
      "Noto Sans Hebrew\n",
      "Noto Sans Hebrew\n",
      "Noto Sans Imperial Aramaic\n",
      "Noto Sans Indic Siyaq Numbers\n",
      "Noto Sans Inscriptional Pahlavi\n",
      "Noto Sans Inscriptional Parthian\n",
      "Noto Sans Javanese\n",
      "Noto Sans Javanese\n",
      "Noto Sans Kaithi\n",
      "Noto Sans Kannada\n",
      "Noto Sans Kannada\n",
      "Noto Sans Kayah Li\n",
      "Noto Sans Kayah Li\n",
      "Noto Sans Kharoshthi\n",
      "Noto Sans Khmer\n",
      "Noto Sans Khmer\n",
      "Noto Sans Khojki\n",
      "Noto Sans Khudawadi\n",
      "Noto Sans Lao\n",
      "Noto Sans Lao\n",
      "Noto Sans Lepcha\n",
      "Noto Sans Limbu\n",
      "Noto Sans Linear A\n",
      "Noto Sans Linear B\n",
      "Noto Sans Lisu\n",
      "Noto Sans Lisu\n",
      "Noto Sans Lycian\n",
      "Noto Sans Lydian\n",
      "Noto Sans Mahajani\n",
      "Noto Sans Malayalam\n",
      "Noto Sans Malayalam\n",
      "Noto Sans Mandaic\n",
      "Noto Sans Manichaean\n",
      "Noto Sans Marchen\n",
      "Noto Sans Masaram Gondi\n",
      "Noto Sans Math\n",
      "Noto Sans Mayan Numerals\n",
      "Noto Sans Medefaidrin\n",
      "Noto Sans Medefaidrin\n",
      "Noto Sans Meetei Mayek\n",
      "Noto Sans Meetei Mayek\n",
      "Noto Sans Mende Kikakui\n",
      "Noto Sans Meroitic\n",
      "Noto Sans Miao\n",
      "Noto Sans Modi\n",
      "Noto Sans Mongolian\n",
      "Noto Sans Mono\n",
      "Noto Sans Mono\n",
      "Noto Sans Mro\n",
      "Noto Sans Multani\n",
      "Noto Sans Myanmar\n",
      "Noto Sans Myanmar\n",
      "Noto Sans NKo\n",
      "Noto Sans Nabataean\n",
      "Noto Sans New Tai Lue\n",
      "Noto Sans Newa\n",
      "Noto Sans Nushu\n",
      "Noto Sans Ogham\n",
      "Noto Sans Ol Chiki\n",
      "Noto Sans Ol Chiki\n",
      "Noto Sans Old Hungarian\n",
      "Noto Sans Old Italic\n",
      "Noto Sans Old North Arabian\n",
      "Noto Sans Old Permic\n",
      "Noto Sans Old Persian\n",
      "Noto Sans Old Sogdian\n",
      "Noto Sans Old South Arabian\n",
      "Noto Sans Old Turkic\n",
      "Noto Sans Oriya\n",
      "Noto Sans Oriya\n",
      "Noto Sans Osage\n",
      "Noto Sans Osmanya\n",
      "Noto Sans Pahawh Hmong\n",
      "Noto Sans Palmyrene\n",
      "Noto Sans Pau Cin Hau\n",
      "Noto Sans PhagsPa\n",
      "Noto Sans Phoenician\n",
      "Noto Sans Psalter Pahlavi\n",
      "Noto Sans Rejang\n",
      "Noto Sans Runic\n",
      "Noto Sans Samaritan\n",
      "Noto Sans Saurashtra\n",
      "Noto Sans Sharada\n",
      "Noto Sans Shavian\n",
      "Noto Sans Siddham\n",
      "Noto Sans SignWriting\n",
      "Noto Sans Sinhala\n",
      "Noto Sans Sinhala\n",
      "Noto Sans Sogdian\n",
      "Noto Sans Sora Sompeng\n",
      "Noto Sans Sora Sompeng\n",
      "Noto Sans Soyombo\n",
      "Noto Sans Sundanese\n",
      "Noto Sans Sundanese\n",
      "Noto Sans Syloti Nagri\n",
      "Noto Sans Symbols\n",
      "Noto Sans Symbols\n",
      "Noto Sans Symbols2\n",
      "Noto Sans Syriac\n",
      "Noto Sans Tagalog\n",
      "Noto Sans Tagbanwa\n",
      "Noto Sans Tai Le\n",
      "Noto Sans Tai Tham\n",
      "Noto Sans Tai Tham\n",
      "Noto Sans Tai Viet\n",
      "Noto Sans Takri\n",
      "Noto Sans Tamil\n",
      "Noto Sans Tamil\n",
      "Noto Sans Tamil Supplement\n",
      "Noto Sans Telugu\n",
      "Noto Sans Telugu\n",
      "Noto Sans Thaana\n",
      "Noto Sans Thaana\n",
      "Noto Sans Thai\n",
      "Noto Sans Thai\n",
      "Noto Sans Tifinagh\n",
      "Noto Sans Tifinagh APT\n",
      "Noto Sans Tifinagh Adrar\n",
      "Noto Sans Tifinagh Agraw Imazighen\n",
      "Noto Sans Tifinagh Ahaggar\n",
      "Noto Sans Tifinagh Air\n",
      "Noto Sans Tifinagh Azawagh\n",
      "Noto Sans Tifinagh Ghat\n",
      "Noto Sans Tifinagh Hawad\n",
      "Noto Sans Tifinagh Rhissa Ixa\n",
      "Noto Sans Tifinagh SIL\n",
      "Noto Sans Tifinagh Tawellemmet\n",
      "Noto Sans Tirhuta\n",
      "Noto Sans Ugaritic\n",
      "Noto Sans Vai\n",
      "Noto Sans Wancho\n",
      "Noto Sans Warang Citi\n",
      "Noto Sans Yi\n",
      "Noto Sans Zanabazar Square\n",
      "Noto Serif\n",
      "Noto Serif\n",
      "Noto Serif\n",
      "Noto Serif\n",
      "Noto Serif Ahom\n",
      "Noto Serif Armenian\n",
      "Noto Serif Armenian\n",
      "Noto Serif Balinese\n",
      "Noto Serif Bengali\n",
      "Noto Serif Bengali\n",
      "Noto Serif CJK JP\n",
      "Noto Serif CJK JP\n",
      "Noto Serif Devanagari\n",
      "Noto Serif Devanagari\n",
      "Noto Serif Display\n",
      "Noto Serif Display\n",
      "Noto Serif Display\n",
      "Noto Serif Display\n",
      "Noto Serif Dogra\n",
      "Noto Serif Ethiopic\n",
      "Noto Serif Ethiopic\n",
      "Noto Serif Georgian\n",
      "Noto Serif Georgian\n",
      "Noto Serif Grantha\n",
      "Noto Serif Gujarati\n",
      "Noto Serif Gujarati\n",
      "Noto Serif Gurmukhi\n",
      "Noto Serif Gurmukhi\n",
      "Noto Serif Hebrew\n",
      "Noto Serif Hebrew\n",
      "Noto Serif Hmong Nyiakeng\n",
      "Noto Serif Hmong Nyiakeng\n",
      "Noto Serif Kannada\n",
      "Noto Serif Kannada\n",
      "Noto Serif Khmer\n",
      "Noto Serif Khmer\n",
      "Noto Serif Khojki\n",
      "Noto Serif Khojki\n",
      "Noto Serif Lao\n",
      "Noto Serif Lao\n",
      "Noto Serif Malayalam\n",
      "Noto Serif Malayalam\n",
      "Noto Serif Myanmar\n",
      "Noto Serif Myanmar\n",
      "Noto Serif Sinhala\n",
      "Noto Serif Sinhala\n",
      "Noto Serif Tamil\n",
      "Noto Serif Tamil\n",
      "Noto Serif Tamil Slanted\n",
      "Noto Serif Tamil Slanted\n",
      "Noto Serif Tangut\n",
      "Noto Serif Telugu\n",
      "Noto Serif Telugu\n",
      "Noto Serif Thai\n",
      "Noto Serif Thai\n",
      "Noto Serif Tibetan\n",
      "Noto Serif Tibetan\n",
      "Noto Serif Yezidi\n",
      "Noto Serif Yezidi\n",
      "Noto Traditional Nushu\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "Open Sans\n",
      "OpenSymbol\n",
      "P052\n",
      "P052\n",
      "P052\n",
      "P052\n",
      "STIXGeneral\n",
      "STIXGeneral\n",
      "STIXGeneral\n",
      "STIXGeneral\n",
      "STIXNonUnicode\n",
      "STIXNonUnicode\n",
      "STIXNonUnicode\n",
      "STIXNonUnicode\n",
      "STIXSizeFiveSym\n",
      "STIXSizeFourSym\n",
      "STIXSizeFourSym\n",
      "STIXSizeOneSym\n",
      "STIXSizeOneSym\n",
      "STIXSizeThreeSym\n",
      "STIXSizeThreeSym\n",
      "STIXSizeTwoSym\n",
      "STIXSizeTwoSym\n",
      "Standard Symbols PS\n",
      "Symbola\n",
      "Tuffy\n",
      "Tuffy\n",
      "Tuffy\n",
      "Tuffy\n",
      "URW Bookman\n",
      "URW Bookman\n",
      "URW Bookman\n",
      "URW Bookman\n",
      "URW Gothic\n",
      "URW Gothic\n",
      "URW Gothic\n",
      "URW Gothic\n",
      "Unifont\n",
      "Unifont CSUR\n",
      "Unifont Upper\n",
      "WenQuanYi Micro Hei\n",
      "WenQuanYi Zen Hei\n",
      "Z003\n",
      "cmb10\n",
      "cmex10\n",
      "cmmi10\n",
      "cmr10\n",
      "cmss10\n",
      "cmsy10\n",
      "cmtt10\n"
     ]
    }
   ],
   "source": [
    "a=sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])\n",
    "for i in a:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "id": "f1c94d90-f648-4d74-84a8-dcd809f6d62e",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.family']=['MiSans']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8da8448d-1abd-4037-82d0-c00489ebc184",
   "metadata": {},
   "source": [
    "## 格式化字符。\n",
    "\n",
    "|字符|描述|\n",
    "|--|--|\n",
    "|'-'|实线样式|\n",
    "|'--'|短横线样式|\n",
    "|'-.'|点划线样式|\n",
    "|':'|虚线样式|\n",
    "|'.'|点标记|\n",
    "|','|像素标记|\n",
    "|'o'|圆标记|\n",
    "|'v'|倒三角标记|\n",
    "|'^'|正三角标记|\n",
    "|'&lt;'|左三角标记|\n",
    "|'&gt;'|右三角标记|\n",
    "|'1'|下箭头标记|\n",
    "|'2'|上箭头标记|\n",
    "|'3'|左箭头标记|\n",
    "|'4'|右箭头标记|\n",
    "|'s'|正方形标记|\n",
    "|'p'|五边形标记|\n",
    "|'*'|星形标记|\n",
    "|'h'|六边形标记 1|\n",
    "|'H'|六边形标记 2|\n",
    "|'+'|加号标记|\n",
    "|'x'|X 标记|\n",
    "|'D'|菱形标记|\n",
    "|'d'|窄菱形标记|\n",
    "|'&#124;'|竖直线标记|\n",
    "|'_'|水平线标记|\n",
    "\n",
    "## 颜色的缩写\n",
    "\n",
    "|字符|颜色|\n",
    "|--|--|\n",
    "|'b'|蓝色|\n",
    "|'g'|绿色|\n",
    "|'r'|红色|\n",
    "|'c'|青色|\n",
    "|'m'|品红色|\n",
    "|'y'|黄色|\n",
    "|'k'|黑色|\n",
    "|'w'|白色|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "id": "cd1ab1ac-b7ee-44ee-9ad7-499235b1d843",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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N7fIn3n5fJnAwEBVr15dZ86cKXD8L7/8Ikku85Akx4J+1atXd/a7w+W1WSwWRUZG6vTp03+6bXZ2tsaPH6/du3cXeMnOarXq888/V9++ffXbb7+59E2bNs0ZBr/55hs1a9ZM3333nbp06aLXX39dvXr1uoajAsyJ4AOgQLfddpvzzq6XX35ZFSpUKHDcN998o06dOmn//v168skntWLFCr355pv6y1/+UqzPO3LkiMt7m82mjIyMAlcylqQaNWpIcqxWfKlz584pIyPD2e8Ol9dmGIYOHTpUaG2XmjBhgo4fP17gGj2S42zZihUrtH//fsXHx7v0XXoGrH///nrzzTdVvnx5DRkyRFarVQ8++GDxDwYwOYIPgELNmTNHx48fv+It05s2bdKFCxe0evVqTZ06VYMGDVK7du108uRJl3EVK1aUJGVkZBS4n5kzZ7q8f/bZZ3XhwgX16NGjwPGdOnWSxWLRCy+84HJmKSkpSbm5uerSpYvLZ2dlZRX50RGXe/7553X+/Hnn+8WLF+vEiRPq1q3bFbfbsGGDFixYoFGjRhV6mVCSOnfurL///e9asmSJ3n777ULH1a9fX3a7XaNGjdLAgQOdd5517tyZ29qBIuKuLgCFKleunEJDQ684pmnTppKkESNGqHfv3srIyNDbb7+d7wzRjTfeqODgYD377LPKyMhQzZo1Xe562rBhgzp37qw2bdpo165d2rBhg6Kjo3XXXXdJknN/SUlJCg0N1c0336xRo0bphRde0G233aZOnTpp3759Sk5OVosWLfTAAw849926dWtt3LhR3bp1U8uWLdW/f381bdpU5cuXV0pKilatWuWcS1OQQ4cOqXXr1urZs6f279+vN954Qw0aNNDf//73Qrf58ccfNXDgQN10001KTEx06bPb7fkWiJw5c6Y2btyooUOHqm3btqpSpUqB+x0+fLh++eUXl6CYt/p03qrbPj78Py1QGP7rAHBNunbtqvnz5ys7O1szZ87Uf/7zH61cuVL169d3GRcYGKg1a9YoPDxc//znP/XJJ5+49L/55psKDAzU7Nmz9emnn2ro0KHasGGDMyDcfvvtat26tbZs2aKvvvpKkjR37lzNmzdPNptNc+bM0aeffqpRo0YpJSVF5cqVc+77scce06BBg/Tll1/q5Zdfds4bGj9+vGw2m5YvX37FY1ywYIFatWql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S1tRJ0cBQJ7kZCk2Vrr8X9O8q/Nr10oxMaVfF2AmRf3+LlLwWblypVauXCnJcamrcePGql69urP/woUL+uyzz9SlSxe9++67bijfcwg+AIojJ8dxZufo0YL7LRYpPFw6dIjLXkBJcutdXVWrVlWDBg0kOYJPrVq1VLduXWe/1WpVnz59/vSOLwC43qSmFh56JMdZoLQ0x7j27UutLACFKFLw6dmzp/PS1sGDBzV16lTddtttJVoYAJQF6enuHQegZBX7IaUpKSmSHAHo22+/Vbly5dS8eXPVrl3b7cUBgLcrZDH5qx4HoGQVO/hkZWWpX79+2rJli/KmB1ksFvXt21dLly5VQECA24sEAG8VHe2Yw3PsWP7JzdIfc3yio0u/NgD5Fft29qFDh2rHjh1avny5srKylJWVpRUrVmjDhg0aPnx4SdQIAF7LapXmzXP8/fI1VvPez53LxGbAWxQ7+GzcuFFTpkzRwIEDFRgYqMDAQD3wwAN68skntX79+hIoEQC8W0yM45b1sDDX9vBwbmUHvE2xL3VVr15d1apVy9des2ZN58NBAcBsYmKk3r1ZuRnwdsUOPs8884yefvpptW3bVvXr15ckHT58WLNnz3auogwAZmS1css64O2KvXJzkyZN9N///lfnz5/XjTfeKEnat2+ffHx8XNb2kaT9+/e7r9JSwgKGAACUPW5dwPBSsbGx11QYAACApxT7jM/1jjM+AACUPSV2xkeSPvjgA23evFmnT5/O17ds2bKr2SUAAECJK3bwWbRokUaMGKG//vWv2rVrl5o3b66TJ0/q7NmzatGiRUnUCAAA4BbFXsdn9uzZGjdunD744AMZhqE5c+bo4MGDuuGGGxTDYhUAAMCLFTv4HDt2TM2aNVNgYKDKlSunU6dOyc/PT0OGDNH06dNLokYAAAC3KHbw+Z//+R9t3rxZFotFTZo00euvvy7JsZbP77//7vYCAQAA3KXYwWfu3LnOSc3Tp0/X+vXrFRISounTpysuLs7d9QEAALjNNd/O/t1332nr1q0KDw/X3Xff7a66PIbb2QEAKHtK9Hb2n376yblK880336ybb75ZP/3009VVCgAAUEqKfanr/fff1w033KCvv/7a2bZ79241atRImzdvdmtxAAAA7lTsS10tWrTQDTfcoNdee82lvX///tq3b5+++uortxZY2rjUBQBA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7LPPVKFCBYWEhGj+/PmeLsu0hg8frtjYWHXr1k21atVS165d1atXL40ZM8bTpZnW4cOHJUkNGzZ0aY+KitKhQ4dKrQ7m+OCqTJo0ST/88IPWrFnj6VJMa+LEiQoKCtL48eM9XQokzZgxQ5UrV9bEiRPVqFEjrV+/XqNHj1ZoaKhiY2M9XZ7prF27Vq+88oomT56sVq1a6dNPP9WsWbPUs2dP9enTx9PlmdLZs2cl5X+QaOXKlUv1RhmCD4pt6dKlmjVrllatWqVGjRp5uhxT2rVrl5YuXaolS5bIbrfLbrfr4sWLOn/+vGw2G0+hLmX79+/X/v37tXr1avXv31+S1KNHDx0+fFiLFy8m+JQywzD06KOPauLEifrHP/4hSerevbt8fX0VHx9P8PGQgIAASVJWVpYqV67sbD9z5oyzrzRwqQvFsmnTJg0bNkxPP/208x94lL6FCxcqNzdXDz74oKpUqaIqVaro448/1muvvaamTZt6ujzTyczMlCS1aNHCpb158+ZKT0/3REmm9ssvvygtLU2tWrVyaW/VqpV++uknnTx50kOVmVu9evUkOZZ8uNTBgwcVGRlZanUQfFBkX3zxhfr27avBgwcrISHB0+WY2rhx45SSkuLyatGihe644w4uP3pA/fr15ePjo3//+98u7du3b+esqAdUrlxZFSpU0I4dO1zad+zYoQoVKricbUDpadq0qapVq6bVq1c729LT05WSkqKOHTuWWh1c6kKRHDlyRD169FBwcLDuuOMOrV+/3tnXpk0bVa9e3XPFmdCNN96oG2+80aWtSpUqqlWrllq3bu2hqsyrZs2aGjRokOLj43X06FE1bNhQb731lnbt2qXU1FRPl2c6fn5+GjVqlJ599ln9+uuvatmypXbt2qX58+frsccek5+fn6dLNCVfX1+NHz9eCQkJqlSpknMdn5CQEA0aNKj06ii1T0KZ9tFHH+nEiROSlG++QkpKitq3b++BqgDvsXDhQtWsWVNLlizRqVOn9D//8z/atGkTQdRDEhMTVb16dS1atEgvvfSSIiIiNGPGDD322GOeLs3UHn/8cdntdi1YsECnT59W69attWrVqlJbvFBiAUMAAGAizPEBAACmQfABAACmQfABAACmQfABAACmQfABAACmQfABAACmQfABAACmQfAB4PUOHz6s6tWr61//+penS8nnqaee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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(1,11) \n",
    "y =  2  * x +  5 \n",
    "plt.title(\"Matplotlib 示例\") \n",
    "plt.xlabel(\"x axis caption\") \n",
    "plt.ylabel(\"y axis caption\") \n",
    "plt.plot(x,y,\"ob\") \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "id": "0fd899af-68be-41b4-901c-b362bef7ba33",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 计算正弦曲线上点的 x 和 y 坐标\n",
    "x = np.arange(0,  3  * np.pi,  0.1) \n",
    "y = np.sin(x)\n",
    "plt.title(\"sine wave form\")  \n",
    "# 使用 matplotlib 来绘制点\n",
    "plt.plot(x, y) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "id": "143203bb-cc07-42a7-bd69-39197b48706e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 计算正弦和余弦曲线上的点的 x 和 y 坐标 \n",
    "x = np.arange(0,  3  * np.pi,  0.1) \n",
    "y_sin = np.sin(x) \n",
    "y_cos = np.cos(x)  \n",
    "# 建立 subplot 网格，高为 2，宽为 1  \n",
    "# 激活第一个 subplot\n",
    "plt.subplot(2,  1,  1)  \n",
    "# 绘制第一个图像 \n",
    "plt.plot(x, y_sin) \n",
    "plt.title('Sine')  \n",
    "# 将第二个 subplot 激活，并绘制第二个图像\n",
    "plt.subplot(2,  1,  2) \n",
    "plt.plot(x, y_cos) \n",
    "plt.title('Cosine')  \n",
    "# 展示图像\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "id": "70d3f2e5-7e79-4c10-9152-961006a5bb08",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAHFCAYAAAA64xk9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAALJxJREFUeJzt3Xt8j/Xj//HnW7N3Gzs4ZsyHidGBRco6YvThMyxqHzlGOuBTSYwsEVrmrFIZpZypVOhgieb48amPvk0H536mLUOGjcbbYdfvj269a21En+19XS8e99vtut1cr+u63u/n+2rL0+u63u+3y7IsSwAAAIYoY3cAAACAi0F5AQAARqG8AAAAo1BeAACAUSgvAADAKJQXAABgFMoLAAAwCuUFAAAYhfICAACMQnkBcE4tWrSQy+UqtFSoUEG33Xabli1bZnc8n3O5XOrRo4fdMYDLnp/dAQA4W3BwsBITE73rBw4c0KJFi9SpUyd9+OGHio2NtTEdgMsR5QXAeQUFBWnYsGGFxh566CFdf/31mj9/PuUFgM9x2QjARatcubIk6fTp04XGP/zwQ0VHRyswMFA1atRQr169tG/fPu/22bNny+VyadWqVZo7d65uuOEG3Xfffed9rlmzZunaa69VQECAmjRpotTUVHXs2FG1a9f27lO7dm3dfvvt2rdvn+6//35VqVJFW7ZskSRt375dcXFxCg0NVcWKFdW6dWt98cUX3mMzMjLkcrk0btw4vfDCC6pTp44CAwN16623as2aNcVmeu+999SwYUOVK1dOzZo108aNGy/m9AH4HzHzAuC8zp49q927d3vXs7Oz9dxzz+nKK6/UE0884R3fvHmz4uLiFBUVpSFDhmjPnj1asGCB0tPT9cUXX8jtdnv3nThxotLT09WxY0e1atXqnM89adIkDRkyRPXq1dOgQYN04MABxcfHKyQkRGXLli2076FDh3TrrbeqTp066tu3r8LCwvTzzz+rZcuWkqRHHnlEp0+f1uzZs9WqVSt99dVXqlu3rvf4l19+WadPn9b999+vkydPau7cubrrrru0evVq3Xnnnd79Nm7cqDVr1qhr1646fPiw5syZo3bt2mnXrl2qUqXKXz/RAC6cBQDn0Lx5c0tSkcXlclkTJ060CgoKCu2/cuVK69SpU971UaNGWZKsdevWWZZlWW+++aYlyWratKmVm5t73uc+duyYFRgYaDVs2NA6fvy4d3zVqlWWJKtWrVresVq1almSrAULFhR5nPT0dCsrK8u7vmbNGkuSNWbMGMuyLGvPnj2WJKtChQrWDz/84N1vy5Ytltvttm699VbvmCQrODjY+vHHH71jEyZMsCRZc+bMOe/rAVBymHkBcF4VK1bUjBkzvOuHDx/WypUrNWTIEG3ZskXz5s3zbrvrrrskSceOHdNPP/2kiIgISdKePXt0xx13ePdLSEhQcHDweZ9348aNys/P16OPPqpy5cp5x1u1aqWbb75ZBw4cKLR/gwYN1K1btyKPExUVJUnyeDzav3+/qlWr5s30e7169VLNmjW9640aNVKnTp301ltv6cSJEwoICJAk3Xnnnapevbp3v3bt2mno0KH64Ycfzvt6AJQcyguA8woICFB8fHyhsUceeUS9evXS3Llz9eSTT6pJkyY6ceKExo4dq1mzZik7O7vQ/gUFBYXWK1Wq9KfPe/jwYUlSeHh4kW21a9cuUl7O9ZhvvvmmpkyZom+//fa8mX4tWn8csyxLubm53vISEhJSaJ/AwEBJ0pkzZ873cgCUIG7YBfCX3HjjjZKknTt3SpL69OmjpKQk3XHHHXr11Ve1ePFijRo16i8/flhYmCTp//2//1dkW2Zm5gU9xowZM9SnTx8FBQVp0qRJWrBggd55551i9y1u5uT777+Xv7+/9wZlAM5AeQFw0QoKCrwfUlerVi1J0rJly3TXXXfprbfeUv/+/XXfffcVmd24GLfccotCQkL00ksvKTc31zu+fv16bdq06YIeY9myZQoICND69es1ePBgdevW7ZwzNHPmzNH+/fu9619//bWWLVumNm3ayM+PSWrASfiNBHBex44d07hx47zrOTk5+vjjj7V161a1bt1a0dHRkn65R2TNmjXq16+fqlatqo0bNyorK+svP6/b7daECRPUt29fRUVFKT4+Xj///LPmz5+vsLAwuVyuP32MRo0aacWKFerUqZNuvPFG7dy50/sW6j86e/asmjZtqh49eujnn3/W3LlzVaZMGT3//PN/+TUAKB2UFwDnlZeXV+gTdoOCghQREaGJEyfq0Ucf9ZaIRYsW6YknntDixYvl5+enrl27KiEh4X/6ELtHHnlEgYGBGjdunF5++WVdffXVmjNnjmbMmKEff/zxT48fNWqUjh8/riVLlmj1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iDwej6ZPn64jR44oOjpaCxYsUFBQkN3RAACAA9heXlq0aCHLsrzrLpdLI0aM0IgRI2xMBQAAnMpR97wAAAD8GcoLAAAwCuUFAAAYhfICAACMQnkBAABGobwAAACjUF4AAIBRKC8AAMAolBcAAGAUygsAADAK5QUAABjlL5WXvXv3ev988uRJffDBB/ruu+9KLBQAAMC5XHR5+eijjxQZGalt27apoKBALVu21N13362oqCjNnTu3NDICAAB4XXR5efrpp9WjRw9dc801Wr58ufbt26f9+/drwIABev7550sjIwAAgNdFl5ddu3apbdu2kqT3339fnTt3VtWqVRUdHa2srKwSDwgAAPB7fhd7QO3atfXBBx+oevXqevfdd7V69WpJ0qeffqp69eqVeEAAAIDfu+jy8uyzz6pnz55asGCBunfvrmbNmmnt2rV644039O6775ZGRgAAAK+LLi/33Xef7rzzTuXk5Oj666+XJDVv3lybNm3SzTffXOIBAQAAfu+C7nn5/vvvvX/et2+fLMtSxYoVtW/fPu8SHh6uffv2lVpQAAAA6QJnXm655Ra9//77uu222xQeHi6Xy1VkH8uy5HK5dPbs2RIPCQAA8KsLKi8vv/yyoqKiJElpaWmlGggAAOB8Lqi8dO7c2fvnGjVqqG7dusXu9/nnn5dMKgAAgHO46M95adSokSZOnKiCggLv2MmTJzVo0CDdfvvtJRoOAADgjy66vEyYMEHjxo3TTTfdpC1btmjdunVq2LChFixYoFmzZpVGRgAAAK+LLi+PPfaYdu7cqcjISN10002KiYlRTEyMtm/frvvvv780MgIAAHj9pW+VXr16tdauXavatWurXLly+u6773ibNAAA8ImLLi+xsbHq0aOHevXqpW+++UbffvutypcvryZNmmjYsGGlkREAAMDrosvLjz/+qE2bNik5OVlut1s1a9ZUamqqpk+frhkzZpRGRgAAAK+L/nqAL7/8Un5+RQ/r06eP99umAQAASstFlxc/Pz99+umnSk1N1ZEjR4psf+ONN0okGAAAQHEuurzMmDFDjz76qG688UZt3rxZjRs31sGDB5Wfn68mTZqURkYAAACvi77nZdKkSUpISNCnn34qy7I0efJk7d69W/Xr19c999xTGhkBAAC8/tINuzfccIOCgoJUtmxZHT58WP7+/nr44YeVlJRUIqEsy9KECRNUt25d+fv7KyIiQklJSYU+1RcAAFyeLrq8REVFKTU1VS6XSw0bNtRbb70lScrIyNDJkydLJNSUKVOUmJioTp06ae7cuercubNGjRqliRMnlsjjAwAAc130PS8vvPCCxo4dK0lKSkpSx44dVbVqVR0+fFgDBw4skVDr1q1T+/btvWWlS5cu2rVrl9atW6ennnqqRJ4DAACY6aLLS7NmzbRs2TJJUtu2bfXll19q1apVCg8P17333lsiodq2batnnnlGK1asUJMmTZSenq7169frmWeeKZHHBwAA5rro8vJH1113na677rqSyOLVv39/paenKzY21jvWp08fPfHEEyX6PAAAwDz/c3kpDUuWLNHcuXM1YsQINWvWTJ9//rkmTpyoDh06qGPHjkX293g88ng83vW8vDwfpgUAAL7kuPJiWZYGDRqkxMREjRw5UpLUrl07+fn5aeDAgcWWl+TkZI0ePdrHSQEAgB3+0rdKl6affvpJmZmZatasWaHxZs2aae/evTp48GCRYxITE5Wbm+tdMjMzfRUXAAD42AWVl8mTJ+v06dOlnUWSFBoaqoCAAG3cuLHQ+MaNGxUQEKDQ0NAix7jdbgUHBxdaAADApemCLhsNGzZMr7zyisaOHasuXbqUaiB/f389/vjjGjdunI4fP66mTZtq8+bNmjZtmgYPHix/f/9SfX4AAOBsFzTz8s033+jmm29W9+7dddNNN2nt2rWlGio5OVnPP/+8li9frgceeEDLly/X2LFjvZ8vAwAALl8XVF4aNGigxYsXKz09XTVr1lRMTIzi4uL01Vdfad++fYWWEglVpoyGDBmi3bt3y+PxaPfu3RoyZIjKlHHcLToAAMDHLurdRg0bNtR7772nlStX6u6779ZHH33k3WZZllwul86ePVviIQEAAH51UeXlyJEjmjBhgl555RXVqVNHI0eOVLVq1UorGwAAQBEXVF7y8vI0efJkvfjiiwoICNCkSZP00EMPcRkHAAD43AWVl1q1auns2bMaPHiwEhISVK5cudLOBQAAUKwLKi+dO3fW6NGjuUQEAABsd0HlZcaMGaWdAwAA4IJw0woAADAK5QUAABiF8gIAAIxCeQEAAEahvAAAAKNQXgAAgFEoLwAAwCiUFwAAYBTKCwAAMArlBQAAGOWCvh4AAAD8Na7RLrsjlDjrWcvW52fm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RcrLy9MjjzxidxRb/PTTT8rMzFSzZs0KjTdr1kx79+69rH43JOn222/X3r179d///ldLly6V2+3W+PHjdcUVV9gdzeciIiIkqcjM9O7du1W7dm0bEsEXKC8Ok5eXp7vvvltff/21d+zIkSPasWPHJf2e/T+qU6eOypQpo3Xr1hUa37BhgyIjI21KZZ+UlBS1adPmsv2fcWhoqAICArRx48ZC4xs3blRAQEChf3FfLtxut2688UZNmTJFt95662X7brxGjRqpUqVKWrhwoXcsOztbaWlphW5qxqWFy0YOExAQoIyMDP3973/XU089pQoVKuiVV16Rv7+/unfvbnc8n7nqqqvUq1cvDRw4UFlZWapXr57effddbd68WevXr7c7nk9t3rxZmzdvvuzu7fg9f39/Pf744xo3bpyOHz+upk2bavPmzZo2bZoGDx582X4G0uuvv64NGzboyy+/tDuKbfz8/DR06FANHz5c5cuX937OS9WqVdWrVy+746GUUF4cpmzZslq9erWGDBmi5ORk/fzzz7rllluUlpbmffv05eLXG1Rff/11HT58WFFRUVqxYoWio6PtjuZTKSkpqlGjhtq3b293FFslJyercuXKmjFjhl555RXVrFlTY8eO1eDBg+2OZosDBw5o6NCheuCBB3TDDTfYHcdWQ4YMkcfj0fTp03XkyBFFR0drwYIFl/QH1F3u+JA6AABgFO55AQAARqG8AAAAo1BeAACAUSgvAADAKJQXAABgFMoLAAAwCuUFAAAYhfICwCf+85//6IorrtCLL75YaHzVqlVyuVyaO3duiT5fRkaGKleurPnz55fo4wKwHx9SB8BnHn/8cc2ZM0dbt25VeHi4Tp8+raioKNWoUUOffvppiT5XQUGBNmzYoMaNG/NJq8AlhvICwGeOHTuma6+9Vk2bNtX777+vSZMmaeTIkfrmm2909dVX2x0PgCG4bATAZ4KCgvTqq69q6dKlSklJ0ZgxYzRy5MjzFpf9+/crPj5e5cuXV1hYmAYMGKCTJ09Kkvr166ewsDAdPXpUkrRlyxb5+flp3rx5kiSXy+W9bPTVV1/pjjvuULly5RQeHq7x48eLf7sBZqK8APCpDh066J///Kf69++viIgIJSQknHf/+fPna//+/XrppZf01FNPad68eRo9erQkacKECSpbtqyGDRsm6ZfLUq1bt1bPnj2LPE737t118uRJvfbaa3r44Yc1atQoLViwoORfIIBSx7dKA/C5Zs2a6Z133lHz5s3l53f+/w0lJCR4C05eXp5++OEHpaamKjk5WcHBwZoxY4bat28vf39//d///Z++++67Yh/nwIEDGjhwoLp16yZJ+uc//6lrrrmmZF8YAJ9g5gWAT+3fv19jxoxR48aNlZKSom+//fa8++/YsUMdOnRQ+fLlFRISoqlTp+rIkSPe7f/4xz/UrVs3TZs2TWPHjlWtWrWKfZykpCQlJSWpbdu2eu2111S9enW5XK4SfW0AfIPyAsCnBg8erODgYK1du1bXXXed+vfvf857T06dOqW2bdsqOztbL7/8slatWqU+ffoU2ufMmTPatm2bJBUqNX/Uv39/bdu2Tc2bN1dKSorq16/vPQ6AWSgvAHxmzZo1WrhwoZKTkxUUFKRp06Zpw4YNevPNN4vdf+vWrcrIyNCbb76p3r17q1WrVjp+/HihfSZOnKjdu3drypQpGjt27Dlncv79738rPDxciYmJ2rx5sypXrqyZM2eW+GsEUPp4qzQAnzh9+rRuuOEGBQUFadOmTd5LNt26ddPKlSu1Y8cOVapUqdAx2dnZ+tvf/qZ7771XHTp00IoVK7RixQoFBQUpIyND27ZtU+PGjTV16lT1799frVu3Vm5urvcD8Vwul+bNm6dOnTopIiJC11xzjR566CEdOXJEiYmJmjBhgh599FE7TgeA/wEzLwB8YurUqdq6daumTp1a6F6TiRMn6uTJkxo6dGiRY8LCwvTGG29o06ZN6tevn4KDg71l4+zZs3rggQcUFRWlvn37SpJeffVVffPNN5o0aVKhxylXrpxWr14tPz8/9evXT2PHjlXfvn3Vr1+/UnzFAEoLMy8AAMAozLwAAACjUF4AAIBRKC8AAMAolBcAAGAUygsAADAK5QUAABiF8gIAAIxCeQEAAEahvAAAAKNQXgAAgFEoLwAAwCiUFwAAYJT/D5JSIp1iHLVqAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x =  [5,8,10] \n",
    "y =  [12,16,6] \n",
    "x2 =  [6,9,11] \n",
    "y2 =  [6,15,7] \n",
    "plt.bar(x, y, align =  'center') \n",
    "plt.bar(x2, y2, color =  'g', align =  'center') \n",
    "plt.title('Bar graph') \n",
    "plt.ylabel('Y axis') \n",
    "plt.xlabel('X axis') \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "id": "2a4358bd-423f-414d-99de-05f0ac70697e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3 4 5 2 1]\n",
      "[  0  20  40  60  80 100]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])\n",
    "np.histogram(a,bins =  [0,20,40,60,80,100]) \n",
    "hist,bins = np.histogram(a,bins =  [0,20,40,60,80,100])  \n",
    "print (hist) \n",
    "print (bins)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "id": "20a2052d-98fb-41c9-8fed-80073b121e41",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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CwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZs4qLIYNGyaPx6Nhw4YZDQcAAISyKofFe++9p5deekkNGza0HA8AAAhhYVV5UEVFhf7yl7+oX79+KioqMh4SAAAIVVU6YjF//nxt3bpVjz32mPV4AABACAv6iEVhYaGmTp2qCRMmqEWLFqfd3ufzyefz+e+XlJQEu0sAABAigg6LrKwseb1ejR8//oy2z87O1vTp04MeGH65kiauqu0hAAB+oYI6FbJp0ybl5ORo2rRp8vl8KioqUnl5uY4ePXrKIxFZWVkqLi723woKCkwGDgAAfnmCOmIxf/58VVRUaMSIERoxYkTAuvfee0/5+fmVHhMZGanIyMizGiQAAAgNQYXFuHHjdMcddwQsu+eee5SQkKD777/fclwAACAEBRUWbdu2Vdu2bQOWxcXFqXHjxvrNb35jOjAAABB6+EpvAABgpkpfkPVjb731lsU4AADAOYAjFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMEBYAAMAMYQEAAMwQFgAAwAxhAQAAzBAWAADADGEBAADMhAX7AI/Hc9LlzrmzHgwAAAhtQYfF8uXL/f+9e/duZWZmasCAAaaDAgAAoSnosMjIyJAk7d27Vz169NDQoUM1f/5863EBAIAQFHRYSNK+fft03XXX6dprr9UzzzxjPSYAABCiqnTx5n333afPPvtMzz77rFq2bKnVq1efclufz6eSkpKAGwAAODdV6YjFxIkTdcUVVyghIUFPPfWU+vXrp08//VStWrWqtG12dramT59+1gM9E0kTV9XIfgAAwMl53Fl+nOPQoUO6+OKLlZmZqalTp1Za7/P55PP5/PdLSkqUmJio4uJieb3es9l1JYQFgKrIn9mntocA/OKVlJQoJibmtH+/q3TE4sfq16+v1q1ba+/evSddHxkZqcjIyLPdDQAACAFBXWOxZ88edevWTdu2bfMvO3jwoLZt26bWrVubDw4AAISWoI5YxMbGqqioSKmpqRo3bpzi4+M1b948RUREaMiQIdU1RgAAECKCCouoqCitW7dO48eP18yZM/X999+ra9euWrt2rRo1alRdYwQAACEi6GssEhIStHDhwuoYCwAACHH8CBkAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwQ1gAAAAzhAUAADBDWAAAADOEBQAAMENYAAAAM4QFAAAwU6Ww2L59u/r06SOv16vmzZsrMzNThw8fth4bAAAIMWHBPuDAgQO69tprddFFF+nJJ5/Unj179NBDD0mSnnjiCfMBAgCA0BF0WBw9elQ9evTQM888o5iYGEnSoUOH9PLLLxMWAACc54IOi8aNGys3NzdgWaNGjVRaWnrS7X0+n3w+n/9+SUlJsLsEAAAhIuiw+Knjx4/rxRdfVK9evU66Pjs7W9OnTz/b3QBAtUmauKq2h3BeyJ/Zp7aHgBpw1p8KmTRpkrZt26YZM2acdH1WVpaKi4v9t4KCgrPdJQAA+IU6qyMWOTk5euSRR7Ro0SKlpKScdJvIyEhFRkaezW4AAECIqPIRi9WrV2vkyJF68MEHNXjwYMsxAQCAEFWlsNi8ebMGDhyo4cOHa/LkydZjAgAAISroUyHffPONbr75ZsXExOjGG2/UihUr/OuuvvpqXXjhhZbjAwAAISTosFi7dq327NkjSRowYEDAury8PPXo0cNkYAAAIPQEfSpk2LBhcs6d9EZUAABwfuNHyAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYISwAAIAZwgIAAJghLAAAgBnCAgAAmCEsAACAGcICAACYOauw2Lp1q9LT0+XxePTtt99ajQkAAISosKo+8PXXX1ffvn3VsGFDy/EAAIAQVuUjFhUVFZo/f74WL15sOR4AABDCqnzEIi0tTZK0bt06q7EAAIAQV+WwOFM+n08+n89/v6SkpLp3CQAAakm1h0V2dramT59e3bsBAPzCJU1cVdtDOC/kz+xTq/uv9o+bZmVlqbi42H8rKCio7l0CAIBaUu1HLCIjIxUZGVnduwEAAL8AfEEWAAAwQ1gAAAAzhAUAADBz1tdY9OjRQ845i7EAAIAQxxELAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAAZggLAABghrAAAABmCAsAAGCGsAAAAGYICwAAYIawAAAA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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27]) \n",
    "plt.hist(a, bins =  [0,20,40,60,80,100]) \n",
    "plt.title(\"histogram\") \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c7da1e3f-c2c3-42e6-8663-5265e62a16cc",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
